From: Hidetoshi NAGAI Date: 2008-01-29T00:56:28+09:00 Subject: [ruby-dev:33479] Re: Binary String 永井@知能.九工大です. From: "NARUSE, Yui" Subject: [ruby-dev:33402] Re: Binary String Date: Sat, 26 Jan 2008 14:12:04 +0900 Message-ID: <479AC12B.1000801@airemix.com> > > # $KCODE を使うように,必要なメソッドをすべて wrap するというのは > > # あまりにも労力が割に合わないので,当然考えてはおられませんよね? > > そこまでしなくても、-Ke を指定すれば 1.9 のメソッドは対応しますから。 あぁ,なるほど.そういう意味ですか.了解です. > > ライブラリが元々ブロックを受け取ることができる仕様になってなければ > > どうしようもないように思えるのですが... > > ライブラリ「内」でそうした対応を行わせるためには, > > そのライブラリに手を入れるしかないですよね. > > 私がまた何か勘違いしているのでしょうか? > > ブロックを受け取るメソッドの話です。 ではその件は今は除外しておきませんか? 問題となっているライブラリがそうそう都合良く 問題を解消できるようなブロックを受け取ってくれる仕様に なっているとは考えづらいし,議論がどんどん発散してしまいますので. > あとそういえば、Ruby は Open Class なので、外からライブラリのメソッドを > 書き換えてしまうという手もあったりはしますね。 まぁ,ライブラリの中身が分かっていればですね. > > ごめんなさい.nkf は単なる例なのでさして重要ではありません. > > 1.8 由来のライブラリ内部で nkf などの別の文字列処理ライブラリなり > > 組み込みメソッドなりを呼び出す際, > > その 1.8 由来のライブラリは encoding なんてものを知りませんから > > 何らかの encoding を仮定 or 想定して文字列を生成し,処理を依頼します. > > このとき encoding が指定されてはいないし, > > magic comment なんかも入っていませんから, > > ASCII-8BIT で文字列が生成される可能性が高いのですよね? > > nkf の例で何を指そうとしているのかがよくわからないのですが、 > エンコーディングを参照しながら何かするライブラリという趣旨ですか? > nkf では特殊すぎて例として不適切な気がします。 encoding を仮定した処理を行う可能性があるもの, 与えられた encoding 情報に基づいて処理を行う可能性があるもの, encoding の変換を行う可能性があるもの,といった類いのライブラリを ひとまとめにして総称的に「nkf のようなもの」と書いてました. 変な書き方で混乱させてしまい,すみません. 前のメールでの話は [ruby-dev:33285] で From: "NARUSE, Yui" Subject: [ruby-dev:33285] Re: Binary String Date: Wed, 23 Jan 2008 03:52:12 +0900 Message-ID: <47963B63.7040108@airemix.com> > 若干ここの仮定がおかしいように思います。その「手の届かないライブラリ内 > 部」はすべて encoding 非対応なので、encoding が設定されている必要はない > でしょう。encoding が必要になるのは手が届くところまで来てからですから、 > そこで設定してあればよのです。 > > あとは、ライブラリにブロックを渡すなりしてライブラリ中で処理するか、オブ > ジェクトを受け取ってから設定するかすれば。 > > > また,UNDEFINED-8BIT で返されたならば, > > 他の encoding の場合と違って Ruby 1.9 としての処理の結果の > > 必然として得られたものではないということが分かります. > > それが分かれば好きなように料理することができます. > > encoding 非対応のライブラリが返してきた時点で必然の結果得られたものでは > ないことが分かります。 > > > UNDEFINED-8BIT のようなものが存在しなければ, > > ブラックボックスの戻値はすべて同じ encoding であると > > 推定するしかありません. > > 以上の通りなので、この仮定が否定されます。 と述べられていることに対して, 「必ずしもそうではないのでは?」ということで 場合分けしてみたものです. > > 1.8 版で 1.8 的に動作するもの (encoding を利用するような > > (中略) > > ライブラリの想定 encoding に合わせて > > 戻ってきた文字列に対して force_encoding すれば > > 確かになんとか対処できるでしょう. > > -Kn をつけているケースではそうだと思います。-Ke 等をつけていると少々話は > 変わるかもしれません。 なるほど.それによる違いもありますね. > > 見落としがありそうな気もしていますが, > > UNDEFINED-8BIT + default_undefind なら > > 上記のすべてをかなりの確率で救済できそうな気がします. > > これで救済できるのは、文字単位での処理か、バイト単位での処理か、どちらか > に統一されているケースに限ると思います。そのようなケースでは、エンコー > ディング未指定で生成された文字列を -K で指定されたエンコーディングにして > しまった方がスマートでしょう。 「nkf のようなもの」が種々のケースをひとまとめにしてることもあって 成瀬さんが述べられているケースには限らないというようにも思いますが, UNDEFINED-8BIT は動的に変更可能な -K に近いものであるというのは 確かにその通りかもしれません. で,-K で救えない範囲は諦めてもらってもいいのではないかというのも それでは困るという具体例が出てこない限りは強く否定もできません. これ以上,「可能性」で議論しても不毛なようですので, 具体的に困ったという声が出ない限りは提案を取り下げます. それはそれとしてですが, 「成瀬さんが述べられているケースには限らない」の例として, Ruby/Tk で binary と utf-8 や euc-jp が混在して返される (1.8 版での処理のため,すべて ASCII-8BIT になってしまう) というものがありました. この Ruby/Tk が今回の「ライブラリ」または「nkf のようなもの」の 位置付けであった場合,成瀬さんであればどのような対応方法を 選択されるでしょうか? これは純粋に興味としての質問であって, 何かを導入してくれという話ではありませんのでご心配なく.(^_^) -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp