Issue #10418 has been updated by Kouhei S…
Status changed from Assigned to Closed
% Done changed from 0 to 100
Applied in changeset r48109.
-
lib/rexml/source.rb (REXML::IOSource#encoding_updated): Fix a
bug that can’t parse XML correctly when
Encoding.default_internal is different with XML
encoding. REXML::Source converts XML encoding on read. So IO
should not convert XML encoding.
Based on patch by NAKAMURA Usaku.
[ruby-dev:48686] [Bug #10418] -
test/rexml/test_encoding.rb
(REXMLTests::EncodingTester#test_parse_utf16_with_utf8_default_internal):
Add the for the above case.
Bug #10418: REXML’s encoding is broken if reading UTF-16 XML and
Encondig.default_internal is set
- Author: Usaku NAKAMURA
- Status: Closed
- Priority: Normal
- Assignee: Kouhei S.
- Category: lib
- Target version: current: 2.2.0
- ruby -v: -
- Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN
Encoding.default_internal
がセットされている状態でREXMLにUTF-16なIOを食わせると、REXML::Document#encoding
がUTF-16ではなくEncoding.default_internal
になります。
以下パッチ。
Index: lib/rexml/source.rb
===================================================================
--- lib/rexml/source.rb (revision 48095)
+++ lib/rexml/source.rb (working copy)
@@ -285,7 +285,7 @@
case @encoding
when "UTF-16BE", "UTF-16LE"
@source.binmode
- @source.set_encoding(@encoding)
+ @source.set_encoding(@encoding, @encoding)
end
@line_break = encode(">")
@pending_buffer, @buffer = @buffer, ""
Index: test/rexml/test_encoding.rb
===================================================================
--- test/rexml/test_encoding.rb (revision 48095)
+++ test/rexml/test_encoding.rb (working copy)
@@ -91,8 +91,18 @@
utf16 = File.open(fixture_path("ticket_110_utf16.xml")) do |f|
REXML::Document.new(f)
end
- assert_equal(utf16.encoding, "UTF-16")
+ assert_equal("UTF-16", utf16.encoding)
assert( utf16[0].kind_of?(REXML::XMLDecl))
end
+
+ def test_default_internal_with_utf16
+ orig_internal = ::Encoding.default_internal
+ ::Encoding.default_internal = 'utf-8'
+ begin
+ test_ticket_110
+ ensure
+ ::Encoding.default_internal = orig_internal
+ end
+ end
end
end