Project

General

Profile

Bug #18899

Updated by javanthropus (Jeremy Bopp) over 2 years ago

`IO#set_encoding` behaves differently when processing a single String argument than it does when processing 2 arguments (whether Strings or Encodings) in the case where the external encoding is being set to binary and the internal encoding is being set to any other encoding. 

 This script demonstrates the resulting values of the external and internal encodings for an IO instance given different ways to equivalently call `#set_encoding`: 

 ```ruby 
 #!/usr/bin/env ruby 


 def show(io, args) 
   printf( 
     "args: %-50s    external encoding: %-25s    internal encoding: %-25s\n", 
     args.inspect, 
     io.external_encoding.inspect, 
     io.internal_encoding.inspect 
   ) 
 end 

 File.open('/dev/null') do |f| 
   args = ['binary:utf-8'] 
   f.set_encoding(*args) 
   show(f, args) 

   args = ['binary', 'utf-8'] 
   f.set_encoding(*args) 
   show(f, args) 

   args = [Encoding.find('binary'), Encoding.find('utf-8')] 
   f.set_encoding(*args) 
   show(f, args) 
 end 
 ``` 

 This behavior is the same from Ruby 2.7.0 to 3.1.2. 3.0.2.

Back