【问题标题】:Why ruby StringIO does not give different encodings为什么 ruby​​ StringIO 没有给出不同的编码
【发布时间】:2016-02-25 18:06:02
【问题描述】:

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

>>> 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>

【问题讨论】:

标签: ruby encoding stringio


【解决方案1】:

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

a.read(2)

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

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

a.read

因此,您正在阅读直到流结束并返回所有剩余数据。返回字符串的编码可以作为 read 方法的参数给出,也可以默认为您定义的外部编码(在您的情况下为 UTF-8)。

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

a.read

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

【讨论】:

    猜你喜欢
    • 2020-01-25
    • 1970-01-01
    • 2015-10-30
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多