From: kou@... Date: 2014-10-23T08:23:18+00:00 Subject: [ruby-dev:48693] [ruby-trunk - Bug #10418] [Closed] REXML's encoding is broken if reading UTF-16 XML and Encondig.default_internal is set Issue #10418 has been updated by Kouhei Sutou. 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 https://bugs.ruby-lang.org/issues/10418#change-49603 * Author: Usaku NAKAMURA * Status: Closed * Priority: Normal * Assignee: Kouhei Sutou * 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`になります。 以下パッチ。 ~~~diff 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 ~~~ -- https://bugs.ruby-lang.org/