From: "Yugui (Yuki Sonoda)" Date: 2008-12-24T18:51:47+09:00 Subject: [ruby-dev:37577] M17N of erb(1) Was: Re: Current status of 1.9.1 RC1's issues 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 http://yugui.jp 私は私をDumpする