Bug #20067
openIO.pipe `int_enc` and `ext_enc` not working as documented?
Description
From the documentation:
pipe(ext_enc, int_enc, **opts)
If argument int_enc is given, it must be an Encoding object or encoding name string that specifies the internal encoding to be used; if argument ext_enc is also given, it must be an Encoding object or encoding name string that specifies the external encoding to be used.
Test script:
ios = IO.pipe(Encoding::BINARY, Encoding::BINARY)
p [:internal, *ios.map(&:internal_encoding)]
p [:external, *ios.map(&:external_encoding)]
Encoding.default_internal = Encoding::UTF_8
Encoding.default_external = Encoding::UTF_8
ios = IO.pipe(Encoding::BINARY, Encoding::BINARY)
p [:internal, *ios.map(&:internal_encoding)]
p [:external, *ios.map(&:external_encoding)]
Actual output:
[:internal, nil, nil]
[:external, #<Encoding:ASCII-8BIT>, nil]
[:internal, nil, nil]
[:external, #<Encoding:ASCII-8BIT>, #<Encoding:UTF-8>]
Expected output:
[:internal, #<Encoding:ASCII-8BIT>, #<Encoding:ASCII-8BIT>]
[:external, #<Encoding:ASCII-8BIT>, #<Encoding:ASCII-8BIT>]
[:internal, #<Encoding:ASCII-8BIT>, #<Encoding:ASCII-8BIT>]
[:external, #<Encoding:ASCII-8BIT>, #<Encoding:ASCII-8BIT>]
Am I reading the documentation incorrectly, or is it just not working as claimed?
I tried on older versions, and it seems to have been like that all the way down to Ruby 1.9.
The only reliable way I found to have a "binary" pipe is to call IO#binmode
.
Updated by nobu (Nobuyoshi Nakada) 11 months ago
If the same encoding is specified for the internal and external encodings, it means that no encoding conversion will occur.
That's what the internal encoding nil
means.
$ ruby -e 'File.open(IO::NULL, "r:ASCII-8BIT:ASCII-8BIT") {|f| p [f.internal_encoding, f.external_encoding]}'
[nil, #<Encoding:ASCII-8BIT>]
Regarding the external encoding of write-io, it feels something wrong a little.