From: "NARUSE, Yui" Date: 2010-11-20T15:58:16+09:00 Subject: [ruby-dev:42608] Re: [Ruby 1.9-Bug#3990][Closed] tests of rexml/rss reports many errors and failures without iconv 成瀬です。 (2010/11/20 11:36), Kouhei Sutou wrote: > In<4CE53B7E.7050305@airemix.jp> > "[ruby-dev:42593] Re: [Ruby 1.9-Bug#3990][Closed] tests of rexml/rss reports > many errors and failures without iconv" on Thu, 18 Nov 2010 23:43:14 +0900, > "NARUSE, Yui" wrote: > >> 比較対象は全て UTF-8 なので、REXML::Encoding モジュールに >> decode 済み or UTF-8 か否か、を示すインスタンス変数を追加というのは考えました。 > > 内部ではそれでもよいと思いますが、利用者がXML宣言のエンコー > ディングを使いたいときに不便だと思っています。例えば、日本語っ > ぽいものだけ扱い時にエンコーディングがShift_JISかEUC-JPか > UTF-8以外のものは使わないとか、というケースを考えていました。 > このとき、利用者がいちいちREXMLから返されるエンコーディング > を正規化して比較しなければいけないのは面倒だと考えています。 そういう要求が出てくることまでは想像できますが、「日本語っぽいものだけ扱い時」 には、現状 UTF-8, Shift_JIS, Windows-31J, EUC-JP, CP51932, eucJP-ms を 見ないといけないんですよね。 現実的にはエンコーディングで判定するよりも、そのニーズの場合、 XML 全体が CP932 に変換できるかで判定した方がベターだと思います。 また、生の文字列から encoding object にするのは Encoding.find(str) だけでいけますが、Encoding オブジェクトになってしまうともう戻せない、 というのと、後述の理由で IANA の canonical name 以外を指定したい場合も あったりして。 > あ、そういうことではなく、エンコーディングまわりのことは別ト > ピックとして扱ってくれた方が対応しやすかったということです。 確かに仰るとおりです、以後そうします。 >> XML 宣言で用いるエンコーディングと、変換で用いるエンコーディングを別に >> したいケースがあるのですよ。 >> 代表例が Windows-31J と Shift_JIS、CP51932 と EUC-JP です。 > > 私は、Windows-31JとShift_JISが違うとかはわかるのですが、↑の > ことをしたいケースがどういう場合かがわかっていません。 > > また、XML宣言で用いるエンコーディングと変換で用いるエンコーディ > ングは同じものにするべきだと思っています。そうしないと、 > REXMLが出力したXMLをパースする他のXMLパーサが困ると思っていま > す。XML宣言のエンコーディングがShift_JISなのにXMLの中に > Shift_JISにはない文字が入ってしまうかもしれないということです > よね? 「他のXMLパーサ」のためにまさにこれが必要なのです。 Windows の API、kernel32 の MultiByteToWideChar や、Mlang.dll の ConvertINetString、.NET Framework の Encoding は"Shift_JIS" を 与えると Windows-31J として、"EUC-JP" を与えると CP51932 として解釈します。 なので、これらの API を使う XML パーサを送信する時は、Ruby 側では XML 宣言で用いるエンコーディングと、変換で用いるエンコーディングを 変える必要があります。 この辺と先の XML 宣言で用いるエンコーディング名を複合的に踏んじゃったのが、 例えばJava などから Windows 向けの XML をどうやって書き出すか、というお話です。 http://www.artonx.org/diary/20050614.html http://d.hatena.ne.jp/Kazzz/20050614/p1 -- NARUSE, Yui