为什么ruby StringIO不提供不同的编码

为什么ruby StringIO不提供不同的编码,ruby,encoding,stringio,Ruby,Encoding,Stringio,为什么在下面的代码中我会得到不同的编码 >>> require 'stringio' >>> a = StringIO.new('toto') >>> a.read(2).encoding => #<Encoding:ASCII-8BIT> >>> a.read.encoding => #<Encoding:UTF-8> >>> a.read.encoding =>

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

>>> 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>
>需要“stringio”
>>>a=StringIO.new('toto')
>>>读(2)。编码
=> #
>>>读编码
=> #
>>>读编码
=> #

让我们剖析您的代码

a.read(2)
这将从流中读取两个字节并返回一个
字符串
。当您读取特定数量的字节时,Ruby不能保证任何字符边界。因此,它指定返回的字符串将采用二进制编码,即
编码:ASCII-8BIT

在下一行中,您将使用

a.read
因此,您将一直读取到流结束,并返回所有剩余数据。返回字符串的编码可以作为
read
方法的参数提供,也可以默认为定义的外部编码(在您的例子中为UTF-8)

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

a.read

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

@Anthony将外部\u编码和内部\u编码设置为utf-8不会改变任何内容