Kernel.open Ignores :binmode Key in Opts Hash w.r.t Encoding
(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 /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 #=> #Encoding:UTF-8
# A file opened with a mode of 'rb' has BINARY encoding
open('/etc/hosts', mode: 'rb').read.encoding #=> #Encoding:ASCII-8BIT
# A file read with File.binread, which implies a mode string of 'rb', also
# has BINARY encoding
File.binread('/etc/hosts').encoding #=> #Encoding:ASCII-8BIT
Updated by runpaint (Run Paint Run Run) over 8 years ago
binmode means just that the io doesn't convert end-of-line code.
It doesn't imply binary encoding.
The example at the beginning of this report shows that a file opened
with mode rb has BINARY encoding, though. Is the 'b' subtly different
from 'binmode: true'?