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
initialize' from (irb):16:inopen'
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