片桐と申します。
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('負&勝&')
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!( /&/, '&' )
end
rv
end
--- 427,433 ----
rv.gsub!( er[0], er[2] ) if er
end
end
! rv.gsub!( /&/u, '&' )
end
rv
end
----- patch end -----