From: "NARUSE, Yui" Date: 2008-09-26T03:37:32+09:00 Subject: [ruby-dev:36583] Re: Encoding.default_internal のためのパッチ 成瀬です。 Yukihiro Matsumoto wrote: > まあ、-Uオプションは私も考えたんですけどね。ただ、結局、 > default_internalとしてUTF-8を「推奨」することになるので、いっ > そそちらをデフォルトにする方が{いさぎよい|トータルのコスト削 > 減になる}と感じました。 つまるところ、-L デフォルトか -U デフォルトかで考えた結果、 -U デフォルトの方がよいと考えたため、このような案になったということですよね。 -L をデフォルトにした場合のメリットデメリットは、 この 9 ヶ月で出ているのでよいとして、 -U デフォルトのメリットはというと、 1. STDIO やその他 IO の入力が UTF-8 で統一できる 2. ライブラリ作者は出入りするデータが UTF-8 だと仮定できる ということでしたよね。 さて、本当にそうですか? まず、1.は先にあげたリテラルの他に変換に失敗したデータ、 その他何らかの原因で発生した UTF-8 以外の encoding を持つ 文字列が存在する可能性があります。 これは他の完全に Unicode 化してしまった言語とは違う点で、 他の encoding が混在しうる以上、真の統一はできません。 ここで、だいたい統一できるんだからいいじゃないか、 と言ってしまうと、じゃあそれって -U デフォルトじゃなくても そう決めて書けばいいだけのことになってしまいます。 2. も同様で、ライブラリは UTF-8 と仮定できるというのはメリットでなく、 単に UTF-8 決め打ちで手を抜くライブラリを増やすだけで、 結果的に UTF-8 以外の encoding だと使い物にならないライブラリを増やすことに なるのではないでしょうか。 Encoding.default_internal を見るように啓蒙すべきとの答えがありましたが、 そしたら UTF-8 決め打ちを推奨するかのような仕様と矛盾します。 そもそも、決め打ちして聞かないような人々は推奨しなくてもそうするでしょうし。 推奨はそうでない人にまで、決め打ちの甘いささやきを広げるだけに見えます。 つまり、これらは現状大きなメリットにはなりえません。 むしろ、UTF-8 決め打ちのコードを中途半端に増やし、混乱を増長するだけでしょう。 これを本気でメリットにするのならば、enc/* を UTF-8 と trans 以外全て捨て、 内部 encoding を UTF-8 のみにする必要があります。 そうすれば、先の1. 2. のメリットが真に享受出来るだけでなく、 先述のリテラルの問題も解決できます。 しかし、これをやると Unicode サポートが貧弱現状では、 あまりに見栄えのしない代物になってしまいます。 そのため、この方針で先進的になろうとするならば、 Grapheme Cluster 等の Unicode サポートを大幅に強化する必要があるでしょう。 これは言うまでもなく今年中には不可能です。 また、Uniocde 自体、合成文字周りはまだ作りこみが必要に見えますし、 異体字はまだまだ始まったばかりです。 思うに、Unicode 化 は 2.0 送りにして、内部を完全に UTF-32 に決めてしまい、 リテラルも何もかも内部では UTF-32 逆に言えば、Encoding.default_internal のデフォルト UTF-8 導入は中途半端すぎます。 これって、つまるところ __STDC_ISO_10646__ をデフォルトで定義して 突っ込んじゃうようなものなわけで。 結局のところ、Ruby 1.9 においては、 現実的に変えられる範囲では現状はそれなりにバランスの取れたものであり、 Encoding.default_internal をデフォルト nil 導入あたりが限度じゃないかと思います。 > リテラルのエンコーディングに関する考察が弱かったのは認めるの > ですが、書き捨てスクリプトの支援に関しては -e では -L も指定 > したことにする(どうせ入力もスクリプトもlocaleであることが期 > 待される)、ということで対応できるのではないでしょうか。 -e ならばそうですが、ファイルの場合はだめですよね。 > |> 現在では基本Unicodeで構わないとは思いますが、パス名については > |> 変換に伴うデータロスでファイルが見つけられない事態を避けるこ > |> とを考えなければなりません。上では「未定」と書いていますが、 > |> 「変換に失敗した時にはバイナリ」というのが現実的な対処ではな > |> いかと思います。 > | > |毎回 roundtrip することを確認しますかねぇ。 > |で、戻らなかったら元の encoding のまま返すとか。 > |ASCII-8BIT をつけちゃうのは不便なんじゃないかと思います。 > > 確認の手段はともかく、「元のencoding」とはdefault_externalで > すかね。まあ、それはそれでひとつの選択肢だとは思います。 いえ、それぞれの IO#external_encoding です。 -- NARUSE, Yui