From: "NARUSE, Yui" Date: 2008-01-23T03:20:30+09:00 Subject: [ruby-dev:33284] Re: Binary String 成瀬です。 遊楽庵 wrote: >> 「感情的」だと語弊があるかもしれません。なんというか、ASCII-8BIT 以外の >> 何かが欲しいというのが先行しているように感じられます。 >> >> ASCII-8BIT を ASCII 互換オクテット列と解釈した上で、これ以外のものを導入 >> すると ASCII-8BIT との結合・比較ができなくなることを考えると、別の何かを >> 導入することは困難という方向になると思うのですが。 >> > > ありゃ、やっぱり「ASCII互換」という仮定は入ってしまうのですか。 > それだとなんかバイナリデータのイメージからは外れて行っちゃいますね。 みんなが持っているバイナリデータのイメージには実は ASCII 互換が入ってい るのではないか、というのが前提なので、実際は外れてはいない気がします。 > 「ASCII互換」ということは他のコードにencode(force_encodeではなく)したら > 変換されちゃいますよね。当然。 > > 例えば、UNIXの「stringsコマンド」みたいのを実装することを考えると > オブジェクトファイルはバイナリなので、バイナリモードでオープンして > 読み込んだデータもバイナリです。 > ここでencodingは「ASCII-8BIT」になります。 > で、このデータからUTF-16の文字列を切り出して、encode("UTF-16")すると > 元の文字列がUTF-16なのにも拘らず、さらに「ASCII→UTF-16」がかかって > 文字列が壊れます。 > force_encodingしろと言われてしまえばそれまでなんですが、 > 確か「force_encoding」ってエキスパート向けメソッドという話ですよね。 > この処理がそんなにエキスパートな処理だと思いません。 > なので、「ASCII-8BIT」が「ASCII互換」を仮定するなら、 > encodeでもコードコンバージョンがかからないことを保証する「BINARY」 > もしくはそれ相当のエンコーディングが欲しくなってしまいますね。 force_encoding を使ってください、ですね。十分に「エキスパート」だと思い ます。あくまで比較の問題として encode より使う機会が少ないだろうから混同 しないように長くなっているというだけで。絶対的な比較でなく相対的な比較で すな。 ところで、バイナリデータから UTF-16 文字列を取り出す機会より ASCII 文字 列を取り出す機会ははるかに多いと思うのですが、そういう時にいちいち変換せ ずにマッチさせられるのは大きなメリットですよね。 > あともう一つ、無責任なアイデアなんですが、 > encodingが「BINARY」の時は、String#[]やString#[]=がIntegerを返したり > 設定したりできると、Stringを使って計算してる人も喜ぶんじゃないかと > 思います。[ruby-dev:33186]にあったようなヤツです。 > この動作は1.8互換なので、喜ぶ人もいるかと思うのですが… String#[] の戻り値のクラスが encoding によって変わるのはいかがなものか と。String で統一されている方がいいんじゃないかなぁと思います。 # 個人的には文字を取り出すのは str[i,1] でできるので、 # str[i] はコードポイントを返すままでよかったと思うんですけどねぇ。 String#[]= Integer はパッチ書いたことがありますが、いまいち受けが悪いみ たい。String#bytes[]= とかの方向になっていくのですかねぇ。 -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA