From: Kouhei Sutou Date: 2010-11-20T16:24:04+09:00 Subject: [ruby-dev:42610] Re: [Ruby 1.9-Bug#3990][Closed] tests of rexml/rss reports many errors and failures without iconv 須藤です。 In <4CE77185.5080603@airemix.jp> "[ruby-dev:42608] Re: [Ruby 1.9-Bug#3990][Closed] tests of rexml/rss reports many errors and failures without iconv" on Sat, 20 Nov 2010 15:58:16 +0900, "NARUSE, Yui" wrote: >> 内部ではそれでもよいと思いますが、利用者がXML宣言のエンコー >> ディングを使いたいときに不便だと思っています。例えば、日本語っ >> ぽいものだけ扱い時にエンコーディングがShift_JISかEUC-JPか >> UTF-8以外のものは使わないとか、というケースを考えていました。 >> このとき、利用者がいちいちREXMLから返されるエンコーディング >> を正規化して比較しなければいけないのは面倒だと考えています。 > > そういう要求が出てくることまでは想像できますが、「日本語っぽいものだけ扱い時」 > には、現状 UTF-8, Shift_JIS, Windows-31J, EUC-JP, CP51932, eucJP-ms を > 見ないといけないんですよね。 > > 現実的にはエンコーディングで判定するよりも、そのニーズの場合、 > XML 全体が CP932 に変換できるかで判定した方がベターだと思います。 私はそのあたりはよくわからないのですが、CP932は日本語の全部 の文字を含んでいるんでしたっけ?(EUC-JPとCP932を相互に変換 しても欠落する情報がないかどうか) 含んでいないのであれば、上記のエンコーディングかどうかを判断 した方がよさそうな気がします。 >> また、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 宣言で用いるエンコーディングと、変換で用いるエンコーディングを > 変える必要があります。 .NET FrameworkのXMLパーサ以外は困らないのでしょうか? REXMLは.NET Frameworkの実装に合わせるよりはXMLの仕様に合わせ るべきだと思っています。 (XMLパーサじゃなくてSGMLパーサとかならどっちでもいいや、と 思いますが。) > この辺と先の XML 宣言で用いるエンコーディング名を複合的に踏んじゃったのが、 > 例えばJava などから Windows 向けの XML をどうやって書き出すか、というお話です。 > http://www.artonx.org/diary/20050614.html > http://d.hatena.ne.jp/Kazzz/20050614/p1 「Javaと.NETのXMLパーサの挙動の違いではまらないようにするに はUTF-8を使おうね」ということのように読めました。