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 `<main>'
~~~

~~~
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/