From: "NARUSE, Yui" Date: 2010-11-13T18:23:36+09:00 Subject: [ruby-dev:42572] Re: [Ruby 1.9-Bug#3990][Closed] tests of rexml/rss reports many errors and failures without iconv 成瀬です。 (2010/11/07 20:10), Kouhei Sutou wrote: > In<4CD67C08.7060804@airemix.jp> > "[ruby-dev:42548] Re: [Ruby 1.9-Bug#3990][Closed] tests of rexml/rss reports many errors and failures without iconv" on Sun, 7 Nov 2010 19:14:39 +0900, > "NARUSE, Yui" wrote: > >>>> なぜ互換性を挙げたかというと、XMLDecl#encoding を、 >>>> XML 宣言用と transcode 用のどちらの意味にするかを考える際、 >>>> 互換性的には XML 宣言用だと理解するべきだからです。 >>>> # transcode 用では指定自体を CP932 とかに変えないといけない >>>> # というか iconv の時でも Shift_JIS を使うと波ダッシュとかではまる >>> >>> では、2.を解決する方法(XML宣言用とtranscode用のencodingを別 >>> に管理する方法)をいくつか考えて、その中で一番よさそうなもの >>> についてそれが妥当かをあらためて考える、という流れでいいです >>> か? >> >> わかりました、後ほどとパッチを投げます。 > > ありがとうございます。 > 私も思うところはあるので案を出すつもりです。 > ただ、少なくとも年末までわりとやることがあるので、そんなに反 > 応はよくないと思います。すみません。 パッチを作ってみました。 https://github.com/nurse/ruby/compare/trunk...rexml 83a66d67 が encoding を String に戻すもののうち、主要なもの。 8d20327b が 83a66d67 に含まれるべき変更のうち、主要でないものを、 わかりやすさのため今回別にしています 2de823bd が warning 消し 14187b46 が transcode 用の文字コード指定を追加するコードです。 これによって例えば以下のような違いが出ます。 % cat test.rb require 'rexml/document' src = < \u3042\uFF5E end x = REXML::Document.new(src) o = REXML::Output.new(s="", "EUC-JP", "CP51932") x.write(o) p s o = REXML::Output.new(s="", "EUC-JP") x.write(o) % ./ruby test.rb "\n\x{A4A2}\x{A1C1}\n" /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/encoding.rb:34:in `encode': U+FF5E from UTF-8 to EUC-JP (Encoding::UndefinedConversionError) from /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/encoding.rb:34:in `encode' from /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/output.rb:22:in `<<' from /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/formatters/default.rb:87:in `write_text' from /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/formatters/default.rb:50:in `write' from /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/formatters/default.rb:79:in `block in write_element' from /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/formatters/default.rb:78:in `each' from /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/formatters/default.rb:78:in `write_element' from /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/formatters/default.rb:31:in `write' from /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/formatters/default.rb:60:in `block in write_document' from /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/formatters/default.rb:60:in `each' from /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/formatters/default.rb:60:in `write_document' from /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/formatters/default.rb:28:in `write' from /home/naruse/local/ruby/lib/ruby/1.9.1/rexml/document.rb:199:in `write' from test.rb:13:in `
' REXML::Document#write でも transcode encoding を指定できた方がいいかなぁ とも思っているのですが、とりあえず方向としてはこんな感じです。 -- NARUSE, Yui