为什么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 二进制编码的空字符串。
为什么在下面的代码中我得到了不同的编码?
>>> 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 二进制编码的空字符串。