From 4834aa5307d8c4750b7598b6b2ef8728d01d98b4 Mon Sep 17 00:00:00 2001 From: naruse Date: Wed, 8 May 2013 08:47:26 +0000 Subject: [PATCH] * io.c (rb_io_ext_int_to_encs): ignore internal encoding if external encoding is ASCII-8BIT. [Bug #8342] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@40610 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 5 +++++ NEWS | 4 ++++ io.c | 8 ++++++-- test/ruby/test_io_m17n.rb | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index bc95812ae8..824e71e9a1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Wed May 8 17:43:55 2013 NARUSE, Yui + + * io.c (rb_io_ext_int_to_encs): ignore internal encoding if external + encoding is ASCII-8BIT. [Bug #8342] + Wed May 8 13:49:38 2013 NARUSE, Yui * ext/json/generator/generator.c (isArrayOrObject): cast char to diff --git a/NEWS b/NEWS index 86d9cef97f..961976be93 100644 --- a/NEWS +++ b/NEWS @@ -39,6 +39,10 @@ with all sufficient information, see the ChangeLog file. === Core classes compatibility issues (excluding feature bug fixes) +* IO + * incompatible changes: + * open ignore internal encoding if external encoding is ASCII-8BIT. + * Module#ancestors The ancestors of a singleton class now include singleton classes, diff --git a/io.c b/io.c index 2b605336bf..8676293a40 100644 --- a/io.c +++ b/io.c @@ -4868,9 +4868,13 @@ rb_io_ext_int_to_encs(rb_encoding *ext, rb_encoding *intern, rb_encoding **enc, ext = rb_default_external_encoding(); default_ext = 1; } - if (intern == NULL && ext != rb_ascii8bit_encoding()) - /* If external is ASCII-8BIT, no default transcoding */ + if (ext == rb_ascii8bit_encoding()) { + /* If external is ASCII-8BIT, no transcoding */ + intern = NULL; + } + else if (intern == NULL) { intern = rb_default_internal_encoding(); + } if (intern == NULL || intern == (rb_encoding *)Qnil || (!(fmode & FMODE_SETENC_BY_BOM) && (intern == ext))) { /* No internal encoding => use external + no transcoding */ diff --git a/test/ruby/test_io_m17n.rb b/test/ruby/test_io_m17n.rb index ec2086186c..ac3b8eaa1e 100644 --- a/test/ruby/test_io_m17n.rb +++ b/test/ruby/test_io_m17n.rb @@ -105,6 +105,42 @@ EOT } end + def test_open_r_ascii8bit + with_tmpdir { + generate_file('tmp', "") + EnvUtil.with_default_external(Encoding::ASCII_8BIT) do + EnvUtil.with_default_internal(Encoding::UTF_8) do + open("tmp", "r") {|f| + assert_equal(Encoding::ASCII_8BIT, f.external_encoding) + assert_equal(nil, f.internal_encoding) + } + open("tmp", "r:ascii-8bit") {|f| + assert_equal(Encoding::ASCII_8BIT, f.external_encoding) + assert_equal(nil, f.internal_encoding) + } + open("tmp", "r:ascii-8bit:utf-16") {|f| + assert_equal(Encoding::ASCII_8BIT, f.external_encoding) + assert_equal(nil, f.internal_encoding) + } + end + EnvUtil.with_default_internal(nil) do + open("tmp", "r") {|f| + assert_equal(Encoding::ASCII_8BIT, f.external_encoding) + assert_equal(nil, f.internal_encoding) + } + open("tmp", "r:ascii-8bit") {|f| + assert_equal(Encoding::ASCII_8BIT, f.external_encoding) + assert_equal(nil, f.internal_encoding) + } + open("tmp", "r:ascii-8bit:utf-16") {|f| + assert_equal(Encoding::ASCII_8BIT, f.external_encoding) + assert_equal(nil, f.internal_encoding) + } + end + end + } + end + def test_open_r_enc_in_opt with_tmpdir { generate_file('tmp', "")