From: d.bussink@... Date: 2014-09-23T18:21:23+00:00 Subject: [ruby-core:65247] [ruby-trunk - Bug #10285] StringIO with encodings broken due to #9769 Issue #10285 has been updated by Dirkjan Bussink. As another data point, I also tried this with writing to a file which seems to work: ~~~ File.open("out.txt", :mode => "w", :encoding => Encoding::ASCII_8BIT) do |f| str1 = "quz \x83 mat".force_encoding(Encoding::ASCII_8BIT) f.write(str1) str2 = "foo \x97 bar".force_encoding(Encoding::WINDOWS_1252) f.write(str2) end p File.read("out.txt") ~~~ ---------------------------------------- Bug #10285: StringIO with encodings broken due to #9769 https://bugs.ruby-lang.org/issues/10285#change-49079 * Author: Dirkjan Bussink * Status: Open * Priority: Normal * Assignee: * Category: * Target version: * ruby -v: 2.1.3 * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- 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/