# \[Closed\] REXML's encoding is broken if reading UTF-16 XML and Encondig.default\_internal is set

**URL:** <https://www.ruby-forum.com/t/closed-rexmls-encoding-is-broken-if-reading-utf-16-xml-and-encondig-default-internal-is-set/232707>\
**Category:** Development\
**Created:** [October 23, 2014, 10:24am UTC](https://www.ruby-forum.com/t/closed-rexmls-encoding-is-broken-if-reading-utf-16-xml-and-encondig-default-internal-is-set/232707 "2014-10-23T10:24:08Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![addis\_a](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c4cdca/32.png) [@addis\_a](https://www.ruby-forum.com/u/addis_a)\
**Post date:** [October 23, 2014, 10:24am UTC](https://www.ruby-forum.com/t/closed-rexmls-encoding-is-broken-if-reading-utf-16-xml-and-encondig-default-internal-is-set/232707/1 "2014-10-23T10:24:08Z")

</div>

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

> **[Bug #10418: REXML's encoding is broken if reading UTF-16 XML and...](https://bugs.ruby-lang.org/issues/10418#change-49603)**
>
> Redmine

- 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`になります。  
以下パッチ。

```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

```
