Yuguiです。

Yukihiro Matsumoto さんは書きました:
> default_internalがnilの時、
> 
>   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"が基本形で、
省略するとデフォルトが入るという仕様のほうが分かりやすいと感じます。

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

そこで、開発会議でお話ししたような
Encoding.with_internal(Encoding::UTF8) {
  open(path, "r:external")
}

みたいなやり方やマジックコメントで指定するというやり方あるわけですけれど
も。これはこれで複雑ですよね。特定の変換を、あるいは変換されないことを期
待するライブラリ実装はどのようにしたらよいものでしょうか。

-- 
Yugui <yugui / yugui.jp>
http://yugui.jp
私は私をDumpする