From: nagachika00@... Date: 2014-10-16T13:19:38+00:00 Subject: [ruby-core:65766] [ruby-trunk - Bug #10285] StringIO with encodings broken due to #9769 Issue #10285 has been updated by Tomoyuki Chikanaga. Backport changed from 2.0.0: REQUIRED, 2.1: REQUIRED to 2.0.0: REQUIRED, 2.1: DONE Backported into `ruby_2_1` at r47982. ---------------------------------------- Bug #10285: StringIO with encodings broken due to #9769 https://bugs.ruby-lang.org/issues/10285#change-49498 * Author: Dirkjan Bussink * Status: Closed * Priority: Normal * Assignee: * Category: * Target version: * ruby -v: 2.1.3 * Backport: 2.0.0: REQUIRED, 2.1: DONE ---------------------------------------- It looks like the change in https://bugs.ruby-lang.org/issues/9769 resulted in a behavior change with how StringIO works with different encodings. The following snippet is broken and now raises: ~~~ test_string_io_encoding.rb:8:in `write': incompatible character encodings: ASCII-8BIT and Windows-1252 (Encoding::CompatibilityError) from test_string_io_encoding.rb:8:in `
' ~~~ ~~~ require 'stringio' io = StringIO.new io.set_encoding(Encoding::ASCII_8BIT) io.write("quz \x83 mat".force_encoding(Encoding::ASCII_8BIT)) str = "foo \x97 bar".force_encoding(Encoding::WINDOWS_1252) io.write(str) p io.string ~~~ What is the intended behavior here? If I change the code to not set the encoding on the StringIO object, it does work somehow: ~~~ require 'stringio' io = StringIO.new io.write("quz \x83 mat".force_encoding(Encoding::ASCII_8BIT)) str = "foo \x97 bar".force_encoding(Encoding::WINDOWS_1252) io.write(str) p io.string ~~~ In this case it sees io.string as UTF-8 encoded, but this is invalid. It does allow the second StringIO#write here though. -- https://bugs.ruby-lang.org/