From: Hiroshi Ichikawa Date: 2008-01-20T12:08:37+09:00 Subject: [ruby-dev:33208] Re: Binary String Gimiteです。 > >> 文字列は多くの場合生成した時点で encoding がついていると思うのですが、バ > >> イナリデータはいちいち設定しないとだめですよね。 > > > > それはそうですね。ただ、それは1.8のRuby/Tkでも必要だったこと(バイナリデータは特別な文字列クラスを使う必要があった)ですし、大した手間ではないと思います。永井さんもBINARYエンコーディングについては > > > >> もちろん自動的な判断をさせることは考えていませんし, > >> それは不可能だと思います. > >> スクリプト上で明確に指定した場合に設定されるべきものです. > > > > と言っていますし…。 > > なんとなく、バイナリと明示したい時にだけ明示しておいて、よくわからない場 > 合はよくわからないままよしなにやっていって、なんとかなるだろう、というよ > うな雰囲気を感じるのですが、Ruby 1.9 においては binary encoding の文字列 > と、ASCII-8BIT の文字列は結合・比較不可能だから別物、つまり、ユーザーが > Tk等に渡すバイナリ文字列全てを binary にしなければならないことは了解され > てます?さすがにそれってあまりに面倒なのではないかなぁと思っているのですが。 すいません、Tkを使ったことがないので分からないのですが、文字列ではなくバイナリデータを渡す場面というのはそんなに多いのでしょうか?画像データを渡すときぐらいしか思いつかなかったのですが…。バイナリだと明示し忘れた場合は例外が飛ぶので、その例外を見てforce_encodingを足せばいいだけですし。 ただ、成瀬さんの「バイナリデータとエンコーディング不明な文字列を区別しなくても、エンコーディング不明な文字列をTkに渡してしまったときに文字化けるだけでしょ?」というのももっともなので、個人的には下記A案とB案ならどっちでもいいと思っています。 [A案](成瀬さん案) ・バイナリデータとエンコーディング不明な文字列を区別せず、両方ASCII-8BITとする。 ・TkはASCII-8BIT以外のStringを受け取ったらUTF-8に自動変換する。ASCII-8BITのStringを受け取ったときは変換しない。 問題点: ・エンコーディング不明な文字列をTkに渡すと、それがたまたまUTF-8でない限り文字化ける。 ・そのため、「1.8でたまたま動いていた」コードでは文字化けが起こる。 [B案](Gimite案) ・バイナリデータとエンコーディング不明な文字列に別々のエンコーディング(例えばBINARYとASCII-8BIT)を割り当てる。 ・TkはBINARYのStringを受け取ったら変換しない。ASCII-8BITのStringを受け取ったら例外を投げる。それ以外のStringを受け取ったらUTF-8に自動変換する。 問題点: ・バイナリデータをTkに渡すときは常にforce_encodingする必要がある。 ・「1.8でたまたま動いていた」コードが動かなくなる(ASCII-8BITのStringがTkに渡り、例外が起きる)。 [C案](永井さん案) ・バイナリデータとエンコーディング不明な文字列に別々のエンコーディング(例えばBINARYとASCII-8BIT)を割り当てる。 ・TkはBINARYのStringを受け取ったら変換しない。ASCII-8BITのStringを受け取ったらlocale_charmapでエンコードされてるとみなし、UTF-8に変換する。それ以外のStringを受け取ったらUTF-8に自動変換する。 問題点: ・バイナリデータをTkに渡すときは常にforce_encodingする必要がある。 ・エンコーディング不明(ASCII-8BIT)な文字列をTkに渡すと、それがたまたまlocale_charmapでエンコードされていない限り文字化ける。(逆に、「1.8でたまたま動いていた」コードも問題なく動き続ける)