* 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
This commit is contained in:
naruse 2013-05-08 08:47:26 +00:00
Родитель ce573f3166
Коммит 4834aa5307
4 изменённых файлов: 51 добавлений и 2 удалений

Просмотреть файл

@ -1,3 +1,8 @@
Wed May 8 17:43:55 2013 NARUSE, Yui <naruse@ruby-lang.org>
* 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 <naruse@ruby-lang.org>
* ext/json/generator/generator.c (isArrayOrObject): cast char to

4
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,

8
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 */

Просмотреть файл

@ -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', "")