まつもと ゆきひろです

In message "Re: [ruby-dev:36548] Re: Encoding.default_internal 	のためのパッチ"
    on Thu, 25 Sep 2008 12:16:10 +0900, "Yugui (Yuki Sonoda)" <yugui / yugui.jp> writes:

|>   open(path, "r")
|> 
|>   open(path, "r:default_external")
|> と解釈されます。nilでない時、
|> 
|>   open(path, "r:default_external:internal_encoding")
|
|これは、default_internalがnilでないプロセスからrequireされたライブラリ
|が、open(path, "r")によって元のリソースとはバイト列として異なるものを得
|ることになります。ですから、1.8からのライブラリの移行を少しだけ困難にし
|ます。

そうですね。それは事実です。

|また、default_internalがnilでないときに
|
|  open(path, "r:default_external")
|
|
|
|  open(path, "r:default_external:default_internal")
|
|と解釈されることはないのですね? "mode:external:internal"が基本形で、
|省略するとデフォルトが入るという仕様のほうが分かりやすいと感じます。

これはそのように解釈された方が良いと思います。つまり、

|  open(path, "r:default_external")
|
|  open(path, "r:default_external:default_internal")

ということです。

|ただし、そのようにするとdefault_externalをそのまま取り込むことを期待して
|いる文字変換処理系のライブラリは開いたあとに更にinternalを設定しないとい
|けなくなって面倒になる、という問題はあります。

その問題はありますね。

|そこで、開発会議でお話ししたような
|Encoding.with_internal(Encoding::UTF8) {
|  open(path, "r:external")
|}
|
|みたいなやり方やマジックコメントで指定するというやり方あるわけですけれど
|も。これはこれで複雑ですよね。特定の変換を、あるいは変換されないことを期
|待するライブラリ実装はどのようにしたらよいものでしょうか。

ちょっと苦しいですが、

  open(path, "r:default_external:")

ってのはどうでしょうかね。ああ、あと

  open(path, "r:ascii-8bit")

だけはdefault_internalがなんであろうとそのまま読み込んだ方が
よいでしょうね。

                                まつもと ゆきひろ /:|)