From: usa@... Date: 2014-09-24T15:28:09+00:00 Subject: [ruby-core:65260] [ruby-trunk - Bug #10285] StringIO with encodings broken due to #9769 Issue #10285 has been updated by Usaku NAKAMURA. Backport changed from 2.0.0: UNKNOWN, 2.1: UNKNOWN to 2.0.0: REQUIRED, 2.1: REQUIRED ---------------------------------------- Bug #10285: StringIO with encodings broken due to #9769 https://bugs.ruby-lang.org/issues/10285#change-49088 * Author: Dirkjan Bussink * Status: Open * Priority: Normal * Assignee: * Category: * Target version: * ruby -v: 2.1.3 * Backport: 2.0.0: REQUIRED, 2.1: REQUIRED ---------------------------------------- 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/