为什么Ruby的StringIO不会给出不同的编码

3
为什么在以下代码中我得到了不同的编码方式?
>>> 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>

http://ruby-doc.org/core-2.2.3/IO.html#method-c-new-label-IO+Encoding - Anthony
@Anthony 将 external_encoding 和 internal_encoding 设置为 utf-8 不会改变任何东西。 - ptitpoulpe
1个回答

8
让我们来分析你的代码...
a.read(2)

这会从流中读取两个字节并返回一个String。由于您正在读取特定数量的字节,Ruby 无法保证任何字符边界。因此,它指定返回的字符串将是二进制编码的,即Encoding:ASCII-8BIT

在下一行中,您正在使用

a.read

你现在正在阅读到流的末尾,并返回所有剩余的数据。返回的字符串的编码可以作为read方法的参数给出,也可以默认使用你定义的外部编码(在本例中为UTF-8)。
现在,由于你已经读取到流的末尾,任何后续的读取都将导致错误或简单地返回空字符串。对于StringIO来说,这恰好是一个二进制字符串。虽然我没有找到关于这种特定情况的文档,但它在MRI的StringIO类代码中被清楚地定义了。
a.read

因此,在二进制编码中,它将返回空字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接