On 12/21/08 11:22 PM, Masatoshi SEKI wrote:
> script encodingとは、
> * evalされるStringによって決まるのか、

ERB.resultの場合はそれで良いと思います。ERBに渡した文字列は評価される前
に正しいエンコーディングになっているべきで、それはプログラマの責任です。
ERB.runの場合も評価される文字列と標準出力のエンコーディングが正しくある
べき、ということでいいでしょう。


悩ましいのはerbコマンドで実行されることを期待されたerbファイルです。
ここで、間違ったエンコーディングでファイルを解釈すると昔々の「'表'がバッ
クスラッシュに」問題に似たものを引き起こしかねませんし、あるいは
Kernel#evalが失敗するでしょう。ですから、erbはそのファイルがどのエンコー
ディングで書かれているのか知る必要があります。

その意味で、
> * それともevalするコンテキストの状態によって決まるのか、

これはありませんscript encodingはスクリプトを書いた時点で定まるもので
あって、あとは処理系がどうやってそのエンコーディングを知るかという問題です。

ruby本体の場合、default_external, default_internalは
* commandline option
* ロケール
で決まります。環境変数に左右されたり、オプションの指定を義務づけたり貴重
なshebang引数を消費したりすることなくerbファイルがportableであるために
は、少なくともmagic commentに似た仕組みは必要だと思います。

ですので、
> default_external, default_internalが指示できれば、その後に読む$<.readは
> その指示したencodingとして処理されるのでしょうか?

これはyesですが

> もしそうであれば、-Eのオプションで実質的にscript encodingを知らせたことに
> なりますか?

これは妥当な手段ではないと思います。


> 
> magic commentを含むRubyスクリプトを出力するようなerbのスクリプトを書く
> ときなどにめんどくさそうなので、magic comment以外の方法で解決できた
> らよいなあと考えてます。

これはなるほどと思うのですが、
 <%# -*- coding: UTF-8 -*- %>

これなら地のテキストのmagic commentとは区別が付くのではないでしょうか。

これとは別に、erbの場合は、スクリプトを含まないplainなテキストを入力とし
て解釈することが可能であるようにコマンドラインオプションでscript
encodingを与えてやるという追加の選択肢はありえると思います。
ただ、
* それがユースケースとしてどの程度ありえるのか
* ruby本体はscript encoding指定オプションを(互換性のための-Kを除き)提供
していないことへの兼ね合い
は私では判断が付きませんでした。


また、もう1つの問題があります。
erbが出力するテキストは、どのエンコーディングであるべきでしょうか。
地のテキストのエンコーディング(script encoding)でしょうか。それとも、
default externalでしょうか。それとも、コマンドラインオプションあるいは何
らかのディレクティブで与えられる第三のエンコーディングでしょうか。

実際ユースケースとしてはスクリプトエンコーディングとは別のエンコーディン
グの出力を得たい場合はあると思います。それは、必ずしも依存する
default_external(処理途中で想定される外部リソースのエンコーディング)とは
一致しないかもしれません。

すると、出力エンコーディングの指定オプションというデザイン選択が浮かび上
がります。一方、これを提供しないで常にスクリプトエンコーディングで出力し
てあとはiconv(1)なりnkf(1)なり通せ、という選択もあり得ると思います。

どちらにせよ、RUBYOPTで-Eが指定されている場合に備えて、default_external
に影響されないように何らかの追加実装は必要でしょう。

というあたりで、
* -E, -Uオプションを追加するか(私はすべきと思う)
  * この辺はirbと同じで
* -Kは復活するか?
  * irbではしなかったが、erbはどうするか
* magic commentを提供するか(私はすべきと思う)
  * その構文
* script encoding指定オプションは必要か
  * magic commentと衝突したらどうする?
* 出力エンコーディングは?
  * script encoding (私の意見はこれかな)
  * default external
  * それ以外

についてメンテナの意見を伺いたいと思いました。

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