From: Run Paint Run Run Date: 2010-06-05T12:42:23+09:00 Subject: [ruby-core:30592] [Bug #3392] Kernel.open Ignores :binmode Key in Opts Hash w.r.t Encoding Bug #3392: Kernel.open Ignores :binmode Key in Opts Hash w.r.t Encoding http://redmine.ruby-lang.org/issues/show/3392 Author: Run Paint Run Run Status: Open, Priority: Low Category: M17N, Target version: 1.9.x ruby -v: ruby 1.9.3dev (2010-06-01 trunk 28120) [i686-linux] (Ignoring the encoding names, there appear to be at least 30 permutations of mode string now accepted, and that's before you allow for platform-specific differences, so please forgive me if this is a stupid question.) When Kernel.open, and friends, receive an opts Hash containing :binmode => true, they don't tag the data they read with ASCII-8BIT. However, the--unwritten--spec holds that when data is read from a stream opened in binmode which doesn't specify a pair of encodings with which to transcode, it is tagged ASCII-8BIT. # :binmode is a recognised key in the opts Hash accepted by IO.open, # Kernel.open, File.open, etc. >> open('/etc/hosts', mode: ?r, binmode: true, textmode: true) ArgumentError: both textmode and binmode specified from (irb):16:in `initialize' from (irb):16:in `open' from (irb):16 from /usr/local/bin/irb:12:in `
' # :binmode => true enables binmode: >> open('/etc/hosts', mode: ?r, binmode: true).binmode? #=> true # A file opened with :binmode => true has UTF-8 (Encoding.default_external) encoding >> open('/etc/hosts', mode: ?r, binmode: true).read.encoding #=> # # A file opened with a mode of 'rb' has BINARY encoding >> open('/etc/hosts', mode: 'rb').read.encoding #=> # # A file read with File.binread, which implies a mode string of 'rb', also # has BINARY encoding File.binread('/etc/hosts').encoding #=> # ---------------------------------------- http://redmine.ruby-lang.org