为什么rubyStringIO不给不同的编码

Why ruby StringIO does not give different encodings

为什么在下面的代码中我得到了不同的编码?

>>> require 'stringio'
>>> a = StringIO.new('toto')
>>> a.read(2).encoding
=> #<Encoding:ASCII-8BIT>
>>> a.read.encoding
=> #<Encoding:UTF-8>
>>> a.read.encoding
=> #<Encoding:ASCII-8BIT>

让我们剖析您的代码...

a.read(2)

这从流中读取了两个字节并且return是String。当您读取特定数量的字节时,Ruby 不能保证任何字符边界。因此,它指定 returned 字符串将按二进制编码,即 Encoding:ASCII-8BIT.

在你的下一行中,你正在使用

a.read

因此,您一直在读取流的末尾和 return 所有剩余数据。 returned 字符串的编码可以作为 read 方法的参数或默认为您定义的外部编码(在您的情况下为 UTF-8)。

现在,当您读到流的末尾时,任何后续读取都将导致错误或只是 return 一个空字符串。对于 StringIO,这恰好是二进制字符串。虽然我没有找到关于这个特定案例的任何文档,但它在 MRI 的 StringIO 代码中明确定义 class.

a.read

因此 return 二进制编码的空字符串。