From: Martin Duerst Date: 2008-10-21T16:04:37+09:00 Subject: [ruby-dev:36834] Re: [ruby-cvs:27036] Ruby:r19818 (trunk): * transcode.c (str_transcode0): String#encode without argument now At 10:47 08/10/21, Tanaka Akira wrote: >In article <6.0.0.20.2.20081021093404.0ada7bf8@localhost>, > Martin Duerst writes: > >> ファイル名は以前の議論の結果「変換可能でしたら変換、そうでなかったら >> バイナリ」のままでいいです。そもそもこの変換 (又は無変換) はユーザが >> encode で起こすのではなく、内部で行われているものなので今回の議論では >> 対象外だと思いました。違う言葉で言ってみれば、勿論「対処による」は >> 正しいですが、引数無しの encode と 引数付きの encode の差だけで対処 >> が判別できるのかは相当疑問があります。 > >ユーザがファイル名に対して encode を呼ぶのはありうる話です。 勿論そうですよ。ユーザは encode をどの場面に使うのかは なかなか予想しにくいです。逆にファイル名であっても 表示のためだけや変換ガ可能を知っている上出の可能性も なきにもあらず。 >そういう状況があるのに、無条件に replace というのは乱暴では >ないですか? そういう意見も確かにあります。でも現在には引数無しの encode で 無条件に replace されてしまいますよね。田中さんはそれでいいと 思いますか。 >引数の有無で、というのは、エンコーディングを指定するようなと >きはまじめに考えなさいというメッセージだと思います。 > >なんで簡単だけど不適切な場合があり得るやりかたを拡大したがる >んですか? 「不適切」は場合によります。「不適切」だと思われたら変更すべきです。 こちらとして「拡張したがる」とかではなく、(Encoding の) 引数無しと 引数ありの方は :replace でしたら :replace で、そうではなかったら 例外で統一した方が筋が通って分かりやすいと思っています。 その上に、ファイル名の内部の対応を encode でやろうとしたら、 ただ例外が出ればいいというわけではありませんよね。例外を rescue し、その時に ASCII-8BIT のままにしないといけませんよね。 そういうことを考えたら、「どうせい気をつけないといけないので、 例外を出して欲しいということも簡単に書けるのではないか」 という考え方もあります。ようするに、 例外が即定値の場合: ファイル名など (1a): begin str2 = str.encode(...) rescue str2 = str.force_encoding("ASCII-8BIT) end それ以外 (1b) str2 = str.encode(..., undef: :replace, invalid: :replace) :replace が即定値 ファイル名など (2a): begin str2 = str.encode(..., undef: :exception, invalid: :exception) rescue str2 = str.force_encoding("ASCII-8BIT) end それ以外 (2b) str2 = str.encode(...) ようするに、(1a) はどうせい長いので、(2a) でも構いませんが、 (1b) を (2b) に短縮できるところが嬉しいという筋の議論です。 [ここで ... は Encoding の引数ありでも無しでも同様という意味です] ところで、もう一つの提案として、undef: :foo, invalid: :foo は わりと多いかと思われますので、何か problem: :foo で一発で指定 できると便利という気もしてきました。 >> 後は、Encoding::Converter::UNDEF_HEX_CHARREF はあるが、それと相当 >> する :undef => :hex とかがないのも直した方がいいかと思います。 >> 時間がなかったらこちらでもできます。 > >やめてください。 > >もし :undef => :hex を許したとすると、それは & を & のままに >するが、変換できないものは &#xhhh; にするというものになるで >しょう。 > >そうすると、:undef => :hex を使うにはまず & を & にして >から呼ばなければならず、それを忘れると不適切な結果が生成され >ます。 > >& を & にするのもいっしょにやってくれる :xml => :text を >使ってください。 > >可能なことをなんでも提供すればいいというものではありません。 説明が分かりました。ようするに、Encoding::Converter::UNDEF_HEX_CHARREF は内部用で、直接使うものでもないということです。多分このことを transcode.c の 2958 行あたりに "(internal use)" とか付け加えた方 がいいのではないかと思います。 もしかしてもう一つ似た様な問題があります。 * Encoding::Converter::XML_ATTR_CONTENT_DECORATOR * Encoding::Converter::XML_ATTR_QUOTE_DECORATOR の内一つは :xml => :attr に相当するが、どちかははっきりしないし、 もう一つはどういう用途なのかもはっきりしません。 その関連で enc/trans/escape.trans で transcode_tblgen("", "xml_attr_content_escape", [ ["{00-21,23-25,27-3B,3D,3F-FF}", :nomap], ["22", hexstr(""")], ["26", hexstr("&")], ["3C", hexstr("<")], ["3E", hexstr(">")] ]) を transcode_tblgen("", "xml_attr_content_escape", [ ["{00-21,23-25,28-3B,3D,3F-FF}", :nomap], ["22", hexstr(""")], ["27", hexstr("'")], ["26", hexstr("&")], ["3C", hexstr("<")], ["3E", hexstr(">")] ]) にした方が、結果を "" 内でも '' 内でも使えるようになります。 「xml: :attr の結果は必ず "" 内」というのは制限として ちょっと狭いのではないかと思います。勿論 XML だけを考えると ' でも大丈夫ですが、HTML では正式にはだめで、IE6 で実際に だめのので、数字を使った方がいいと思います。 宜しくお願いします。 Martin. #-#-# Martin J. Du"rst, Assoc. Professor, Aoyama Gakuin University #-#-# http://www.sw.it.aoyama.ac.jp mailto:duerst@it.aoyama.ac.jp