片桐と申します。


REXMLのパーサーに不具合があるようです。文字要素の中の"&"が、"&"として認
識されず、"&"のままで、認識される場合があります。

ある特定の$KCODEの値と"&"の直前の文字の組合せにおいて、この不具合は発生
します。すくなくともruby1.8系では発生する不具合のようです。

rexml/parsers/baseparser.rb中のunnormalizedメソッドの最後の方で、変数rv中の
文字列はUTF-8であるのに"rv.gsub( /&/, '&')"のように置換を行っているため
発生しているのではないかと考えています。

その不具合を再現させるためのテストケースとその不具合と修正するパッチをこの
メールの最後に付けます。現在、運営しているサービスで問題が発生しており、早期
に修正したいため、パッチのレビューをこのリスト上でしていただけると幸いです。

最後になりますが、このような不具合報告をする必要がある場所はどこが適切なので
しょうか? ruby-devとかruby-extなのでしょうか?


以上、宜しくお願いします。


----- testcase start -----
require 'rexml/parsers/baseparser'
require 'test/unit'

class TC_REXML_Parsers_BaseParser < Test::Unit::TestCase
  def test_unnormalize_should_explicitly_use_utf8_character_set_for_regular_expression_to_replace_amplisand
    _kcode = $KCODE
    %w{N U E S}.each do |kcode|
      $KCODE = kcode
      parser = REXML::Parsers::BaseParser.new('')
      res = parser.unnormalize('&#x8ca0;&amp;&#x52dd;&amp;')
      assert_equal("#{[0x8ca0].pack("U")}&#{[0x52dd].pack("U")}&", res)
    end
  ensure
    $KCODE = _kcode
  end
end
----- testcase end -----

----- patch start -----
*** lib/rexml/parsers/baseparser.rb.orig	2007-02-13 08:01:19.000000000 +0900
--- lib/rexml/parsers/baseparser.rb	2007-06-27 09:32:00.000000000 +0900
***************
*** 427,433 ****
                rv.gsub!( er[0], er[2] ) if er
              end
            end
!           rv.gsub!( /&amp;/, '&' )
          end
          rv
        end
--- 427,433 ----
                rv.gsub!( er[0], er[2] ) if er
              end
            end
!           rv.gsub!( /&amp;/u, '&' )
          end
          rv
        end
----- patch end -----