From: Tanaka Akira Date: 2008-01-11T19:10:52+09:00 Subject: [ruby-dev:33027] Re: Binary String In article <20080111.184442.74744388.nagai@ai.kyutech.ac.jp>, Hidetoshi NAGAI writes: > 「役に立たない」というのは, > Ruby/Tk における encoding の自動変換処理での > 判定に際してです ([ruby-dev:32550]). > > ASCII-8BIT はあまり信頼できる encoding ではないですよね? > encoding を明確に指定していなければ簡単に ASCII-8BIT に > なってしまいます. 基本方針として、ASCII でない文字列を ASCII-8BIT で扱うのは例 外的な状況になるべきです。 マルチバイト文字を含むものを ASCII-8BIT で扱うと、文字単位の 操作ができませんから、String のメソッドの動作にも支障を来し ます。encoding を適切に付けないことの問題は tk だけの問題で はありません。 ですから、可能な限り適切な encoding を指定すべきです。 そして、適切な encoding を指定することが困難であるなら、その 困難さを除去する支援を行うことをまず第一に考えるべきです。そ れを充分に考えた結果、それが無理であると確信が持てた時に、は じめて違う形の支援 (例えばBINARY の導入とか)を考えるべきでしょ う。 そして、現在のところ私は、適切な encoding を指定することを容 易にするのが無理だとは思っていません。 ちなみに、encoding や alias を増やす必要はあると思っています。 (ANSI_X3.4-1968 とか) > そのため,ASCII-8BIT とされている文字列の扱いは > Ruby 1.8 の場合と変わりがないと考えています. > > Ruby/Tk では,不明確な場合の encoding を Ruby 1.8 なら $KCODE で, > Ruby 1.9 なら default_external で推定し, > UTF-8 に変換した後に Tcl/Tk 側に渡すようにします. 外から文字列として読み込んだものは default_external になって いるはずです。 にもかかわらずそうなっていないのはバイナリでしょう。 > しかしながら,Ruby と Tcl/Tk とのやり取りには > 画像データなどの binary string も存在します. > 当然,そうした文字列には変換をかけてはいけません. > > 現状の 1.9 では ASCII-8BIT が広く用いられてしまうため, > 「推定による自動変換をすべき文字列」なのか > 「変換してはならない文字列」なのかを > encoding 情報を使って判断することができません. ASCII-8BIT を非ASCII文字列に広く用るのは意図されていません。 広く用いられてしまうことを避ける方向へいくのは不可能だと考え ていますか? > encoding 情報で判断できなければ,現在の Ruby 1.8 の場合のように, > 独自に binary か否かの情報を付与してやらねばなりません. > Ruby 1.9 ではせっかく文字列が encoding 情報を持つようになったのに, > それを活用できずに独自に異なる手段で情報付与せざるを得ないなどという > 無様なことになってしまいます. > 与えられた文字列が独自形式で付与した情報を持つかどうかを > 判断するという余計な手間も必要です. > > 「binary である」ことを明確に指示できる encoding がありさえすれば > 余計な条件判断も必要とせずすっきりと簡単に解決できる問題です. > ASCII-8BIT の replica ということにしておけば, > 以前におっしゃられた binary string のテキスト処理という点でも > 問題はないと思います. ASCII-8BIT を使ってください。 > それでもダメでしょうか? ASCII-8BIT が非 ASCII 文字列に対して広く使われざるを得ないと いう点に関する説得力に欠けています。そのため、私はいまのとこ ろBINARY が必要であるとは思いません。 -- [田中 哲][たなか あきら][Tanaka Akira]