script encoding のまとめ

Ruby 1.9 でのエンコーディングは以下のようになっているようだ。

「scprit encoding」はスクリプトファイルの読み込み時のエンコーディングで、「default external」は外部へ出力するときIOオブジェクトから読み込むときのエンコーディングのこと。

通常のスクリプトの場合
オプション/magic comment指定 script encoding default external
-K・-Eなし、magic commentなし US-ASCII locale
-K・-Eなし、magic commentあり magic comment locale
-Eあり、magic commentなし US-ASCII -E
-Eあり、magic commentあり magic comment -E
-Kあり、magic commentなし -K -K
-Kあり、magic commentあり magic comment -K

スクリプトエンコーディングの優先順位は「magic comment > -K, -E オプション > デフォルト(US-ASCII)」となっているようだ。
出力のエンコーディングは「-K, -E オプション > デフォルト(locale)」の順番だ。

-eおよびstdinの場合
オプション/magic comment指定 script encoding default external
-K・-Eなし、magic commentなし locale locale
-K・-Eなし、magic commentあり magic comment locale
-Eあり、magic commentなし locale -E
-Eあり、magic commentあり magic comment -E
-Kあり、magic commentなし -K -K
-Kあり、magic commentあり magic comment -K

stdin や -e からは、出力エンコーディングは基本的に通常のスクリプトファイルの時とおなじだが、読込む時のエンコーディングは通常のスクリプトで US-ASCII となっていた箇所が、locale に変わっている。
これは、-Eutf-16be などとすると-eの引数全体が一つの識別子とみなされてしまうことへの対応らしい。

なお、-E オプションは Ruby 1.9 から追加されたオプションで、エンコーディングを指定するためのオプション。

ruby-dev:33368 summary of script encoding