From: "U.Nakamura" Date: 2008-01-23T02:12:55+09:00 Subject: [ruby-dev:33283] Re: Binary String こんにちは、なかむら(う)です。 In message "[ruby-dev:33278] Re: Binary String" on Jan.22,2008 23:44:58, wrote: | 例えば、UNIXの「stringsコマンド」みたいのを実装することを考えると | オブジェクトファイルはバイナリなので、バイナリモードでオープンして | 読み込んだデータもバイナリです。 | ここでencodingは「ASCII-8BIT」になります。 | で、このデータからUTF-16の文字列を切り出して、encode("UTF-16")すると | 元の文字列がUTF-16なのにも拘らず、さらに「ASCII→UTF-16」がかかって | 文字列が壊れます。 | force_encodingしろと言われてしまえばそれまでなんですが、 | 確か「force_encoding」ってエキスパート向けメソッドという話ですよね。 | この処理がそんなにエキスパートな処理だと思いません。 いやいや、force_encodingは「普通は使わないメソッド」という話 なんだと思います。 つまり、今Rubyに導入しようとしている仕様上では、基本的には全 ての文字列は自分のencodingを知ってるわけですよね。 だから、それを強制的に置き換えるforce_encodingは普通は使わな くていい、と。 ですが、たまに、入力し終わって文字列オブジェクトができてから じゃないとencodingが設定できないようなプログラムを書かないと いけない場合も確かにあるわけです。 今回の例はまさにそういうパターンで、入力されたバイト列のどこ かを、プログラマだけが知っている方法で切り出して、プログラマ だけが知っているencodingの文字列である、と指定する必要がある、 というものですよね。 force_encodingはまさにこのパターンのためにわざわざ用意されて いるわけです。 | なので、「ASCII-8BIT」が「ASCII互換」を仮定するなら、 | encodeでもコードコンバージョンがかからないことを保証する「BINARY」 | もしくはそれ相当のエンコーディングが欲しくなってしまいますね。 つまりバイト列を変換しないでencodingだけを付け替えたい、とい うことですよね。 それがforce_encodingの機能なのですから、force_encodingを使う べきであり、そしてforce_encodingは元のencodingを無視するから 元はなんでもいいということになります。 | あともう一つ、無責任なアイデアなんですが、 | encodingが「BINARY」の時は、String#[]やString#[]=がIntegerを返したり | 設定したりできると、Stringを使って計算してる人も喜ぶんじゃないかと | 思います。[ruby-dev:33186]にあったようなヤツです。 | この動作は1.8互換なので、喜ぶ人もいるかと思うのですが… 1.9でここが変わったのがいいのか悪いのかはともかく、encodingに よってメソッドの戻り値の型が変わるのはさすがに嬉しくないでし ょう。 となると、バイト列をそのまま表現するクラスを用意するか、文字 列をバイト列とみなして操作するメソッドを用意するか、いずれか になるのではないかと思います。 # と、いうのが、[ruby-dev:33192]ですね。 前者であればそのクラスにはもちろん々encodingなんてないでしょ うし、後者であればそのメソッドを使う場合には文字列のencoding は何であっても無視されるわけで、いずれにせよ「BINARY」という encodingは不要ということになります。 というわけで、今回の例は「BINARY」という独立したencodingを導 入すべきであるという根拠にはならないと思います。 私自身は、何度か「BINARY」不要論側に立ったメールを投げてます けど、実際には、根拠のない直感ではありますが、「BINARY」とい うencodingが必要な局面が本当はあるのではないか、と思っていま す。 が、その局面を示す例がまだ見つからないんですよねえ。 永井先生の[ruby-dev:33281]のように、互換性というか1.8との相互 運用性の面から考えると何か出てきそうには思うのですが、m17nの 仕様はそれを割り切った結果だと言われるとそれもそうですし... それでは。 -- U.Nakamura