From: Kouhei Sutou Date: 2010-11-18T22:46:07+09:00 Subject: [ruby-dev:42592] Re: [Ruby 1.9-Bug#3990][Closed] tests of rexml/rss reports many errors and failures without iconv 須藤です。 In <4CDE5913.7060709@airemix.jp> "[ruby-dev:42572] Re: [Ruby 1.9-Bug#3990][Closed] tests of rexml/rss reports many errors and failures without iconv" on Sat, 13 Nov 2010 18:23:36 +0900, "NARUSE, Yui" wrote: > パッチを作ってみました。 > https://github.com/nurse/ruby/compare/trunk...rexml ありがとうございます。 REXML::EncodingクラスとかREXML::XMLEncodingクラスとかを作ろ うかと思っていたのですが、文字列でもいいような気もしてきまし た。(XML宣言のエンコーディングを比較しているところが分散し ていていろんなところでupcaseがでてくるのが嫌だった。) 実際にコードを書き出したらまた考えが変わるかもしれません が。。。 > 83a66d67 が encoding を String に戻すもののうち、主要なもの。 > 8d20327b が 83a66d67 に含まれるべき変更のうち、主要でないものを、 > わかりやすさのため今回別にしています > 2de823bd が warning 消し > 14187b46 が transcode 用の文字コード指定を追加するコードです。 えーっと、warning消しとかは混ぜないで欲しかったです。 あと、warningを消そうとするのはよいと思うのですが、消すこと が目的な変更はよくないと思っています。ダメなところに気づきに くくなるので。 直すならちゃんとしたコードに直した方がよいと思っています。 例えば、こういうのにはちゃんとassertをつけた方がよいと思って います。 def test_oses_with_bad_EOLs - d = Document.new("\n\n\n\n\n\n\n\n") + Document.new("\n\n\n\n\n\n\n\n") end ということで、エッセンスだけ参考にして書き直しておきますね。 あ、そういえば、decodeのところで必ずBOMをチェックするように していますが、これは必要なんでしょうか?BOMはファイルの先頭 でだけチェックすればいいのだと思っていました。 > これによって例えば以下のような違いが出ます。 これは何による違いですか? > 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) ... > REXML::Document#write でも transcode encoding を指定できた方がいいかなぁ > とも思っているのですが、とりあえず方向としてはこんな感じです。 この機能は私はいらないと思っています。 出力時に指定するのではなく、XML宣言を書き換えて変更するAPIの 方がよいと思っています。(なので今のままでよい。)