From: "NARUSE, Yui" Date: 2008-01-23T03:52:12+09:00 Subject: [ruby-dev:33285] Re: Binary String 成瀬です。 Hidetoshi NAGAI wrote: > にもかかわらず UNDEFINED-8BIT なんて話を出したりしているのは, > さまざまな外部ライブラリをブラックボックスとして用いる場合を > 考えてのことです. > つまり,外部ライブラリのメソッドの戻値の encoding を > どこまで信じたらいいかという話でもあります. > > ASCII-8BIT で返ってきたとして, > これは必然で ASCII-8BIT になっているのか, > それとも未定義のためやむをえず ASCII-8BIT になっているのか... > Ruby 1.9 用の外部ライブラリならいいのですが, > 本来は Ruby 1.8 用である外部ライブラリを援用しているケースでは > 少々やっかいです. ごもっともな指摘だと思います。 > 事実 Marshal のケースでは,何とか対策するために > ライブラリに手を入れざるを得なかったわけですよね? 後述しますが、現段階では手を入れてませんね。 > もちろんここで Ruby/Tk の場合と同様に > 「Ruby 1.8 用のライブラリを使う方が悪い」とか, > 「Ruby 1.8 用のライブラリで文字列を扱うものはほとんど諦めてください」 > とすることもできます. > それも確かに一つの選択肢でしょう. > 開発が継続しているライブラリであれば,いつかは保証できませんが, > 多分,Ruby 1.9 対応は行われるだろうと期待することは可能です. > あるいは,自分でそのライブラリの解析ができる人なら > 自分でパッチを作成して利用可能にすることができるかもしれません. > > ですが,そうでない人の場合はどうでしょう? > 開発が停止してブラックボックスとなっているライブラリが > どうしても必要な人や,1.9 対応をどうしても待てない人は? > すべてのケースで「諦めて 1.8 を使い続けてね」と答えるのを > 是とするのかどうかです. 一義的にはライブラリ側を 1.9 対応させるのがベストなわけですが、ライブラ リ側に手を入れられないことが前提ならば [ruby-dev:33269] のように 途中で force_encoding したり、オブジェクトを受け取ってから force_encoding すれ ばいいでしょう。1.8 非対応なのはわかっているのだから、使う側が force_encoding すればいいよね、と。 > UNDEFINED-8BIT はこうした場合の救済策になるのではないかと考えて > 話に出したものです. > 直接には手が届かないライブラリ内部の処理に > デフォルトの encoding の情報を与えることができます. > その結果,encoding が明記されていない文字列を > 期待する encoding で適切に処理してもらえるように > できる可能性が高まります. 若干ここの仮定がおかしいように思います。その「手の届かないライブラリ内 部」はすべて encoding 非対応なので、encoding が設定されている必要はない でしょう。encoding が必要になるのは手が届くところまで来てからですから、 そこで設定してあればよのです。 あとは、ライブラリにブロックを渡すなりしてライブラリ中で処理するか、オブ ジェクトを受け取ってから設定するかすれば。 > また,UNDEFINED-8BIT で返されたならば, > 他の encoding の場合と違って Ruby 1.9 としての処理の結果の > 必然として得られたものではないということが分かります. > それが分かれば好きなように料理することができます. encoding 非対応のライブラリが返してきた時点で必然の結果得られたものでは ないことが分かります。 > UNDEFINED-8BIT のようなものが存在しなければ, > ブラックボックスの戻値はすべて同じ encoding であると > 推定するしかありません. 以上の通りなので、この仮定が否定されます。 > # 今回も「何だか良く分からないことを感情的に喋っている」と > # 思われて終わりかなぁ...(^_^; いや、言いたいことはわかるのですよ。また、おそらくみんなそういったエン コーディングが必要な場合が存在する可能性は否定していないと思います。 ただ、本当に必要かというと、今のところ必要に見える場面はどれも別のよりい い解決策が存在しているようです。なので、実は必要ないのではないかと。 # 本当に必要かの検討の十分性について感情という修飾がついたのかと たぶん Python だと undefined encoding の提案はすんなり通る・・・というか 実際存在するんですが、とりあえず処理しやすい encoding をつけておいて、わ かった時にちゃんとした文字用 encoding をつけようって方が Ruby 的かなと感 じます。 # undefined: # “Raise an exception for all conversions. # Can be used as the system encoding if no automatic coercion # between byte and Unicode strings is desired.” # http://docs.python.org/lib/standard-encodings.html -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA