From: Yukihiro Matsumoto Date: 2008-09-25T09:15:41+09:00 Subject: [ruby-dev:36540] Re: Encoding.default_internal のためのパッチ まつもと ゆきひろです In message "Re: [ruby-dev:36534] Re: Encoding.default_internal のためのパッチ" on Thu, 25 Sep 2008 06:31:27 +0900, "NARUSE, Yui" writes: |> 以下のような仕様を考えています。 |> |> * default_internalはIOでinternalを指定しなかった場合のエンコー |> ディングである | |internal を指定しなかった場合、IO#internal_encoding は nil のままで |いいでしょうか。 default_internalがnilの時、 open(path, "r") は open(path, "r:default_external") と解釈されます。nilでない時、 open(path, "r:default_external:internal_encoding") になります。 |> * 新設の-Lオプションを指定するとdefault_externalはlocale、 |> default_internalは空になる。 | |これはこのままだとまずいです。 |すべてが UTF-8 ならば言うまでも問題ありません。 |しかし、入力元・出力先・スクリプトのリテラルが全て例えば CP932 の場合、 |Ruby 1.9 では入力とリテラルを結合できません。 |これが、Perl 等の場合はリテラルも変換してしまうので問題ないのですが、 |Ruby 1.9 では リテラルはそのままなので不一致が発生します。 | |oneliner 等の簡単なスクリプトでリテラルをそのまま認識させたい場合に、 |-L 一つとはいえオプションが必要というのは煩雑ではないでしょうか。 | |これの一つの解決策はリテラルも default_internal に変換してしまうことです。 | |もう一つは default_internal の初期値を空にし、 |Unicoder 用のオプションを新設することです (幸い -U が空いています)。 | |思うに、Ruby は日々の簡単なスクリプトに最適化されるべきです。 |なぜならば、そのような場合は書く絶対量、処理にかかる絶対時間が短いので、 |些細な違いのインパクトが大きいからです。 | |例えば ruby -pe'1' < hoge.txt としたときに、 |無駄に変換が2回走るのはいかがなものかとか、 |数行の書き捨てスクリプトでいちいち -L 指定しないといけないとか、 |数行に対しての " -L" なので、まぁそれなりにインパクトは。 | |一方の Unicode は基本的に巨大な伽藍を築く際に真価を発揮するわけで、 |ごてごてとオプションをつけさせるのは悩み多き Unicoder には煩雑でしょうが、 |-U オプション一つならば問題ないんじゃないかあぁ。 まあ、-Uオプションは私も考えたんですけどね。ただ、結局、 default_internalとしてUTF-8を「推奨」することになるので、いっ そそちらをデフォルトにする方が{いさぎよい|トータルのコスト削 減になる}と感じました。 リテラルのエンコーディングに関する考察が弱かったのは認めるの ですが、書き捨てスクリプトの支援に関しては -e では -L も指定 したことにする(どうせ入力もスクリプトもlocaleであることが期 待される)、ということで対応できるのではないでしょうか。 |> 現在では基本Unicodeで構わないとは思いますが、パス名については |> 変換に伴うデータロスでファイルが見つけられない事態を避けるこ |> とを考えなければなりません。上では「未定」と書いていますが、 |> 「変換に失敗した時にはバイナリ」というのが現実的な対処ではな |> いかと思います。 | |毎回 roundtrip することを確認しますかねぇ。 |で、戻らなかったら元の encoding のまま返すとか。 |ASCII-8BIT をつけちゃうのは不便なんじゃないかと思います。 確認の手段はともかく、「元のencoding」とはdefault_externalで すかね。まあ、それはそれでひとつの選択肢だとは思います。 |> * 基本UTF-8を返せばよい、入力もUTF-8を期待 |> * より親切なライブラリはdefault_internalで返す。入力は |> encodingを見て対処 | |default_internal が空の場合は default_external で返すのですかね。 そうです。 まつもと ゆきひろ /:|)