为什么ruby的StringIO不支持多种编码转换功能?
- 内容介绍
- 文章标签
- 相关推荐
本文共计357个文字,预计阅读时间需要2分钟。
为什么在下面的代码中我得到不同的编码?
pythonrequire 'stringio'a=StringIO.new('toto')a.read(2)a.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> 让我们剖析你的代码……
a.read(2)
这将从流中读取两个字节并返回一个String.当您读取特定数量的字节时,Ruby无法保证任何字符边界.因此,它指定返回的字符串将通过二进制编码,即编码:ASCII-8BIT.
在下一行中,您正在使用
a.read
因此,您将读取直到流的末尾并返回所有剩余数据.返回字符串的编码可以作为read方法的参数给出,也可以默认为定义的外部编码(在您的情况下为UTF-8).
现在,当您已读到流的末尾时,任何后续读取都将导致错误或仅返回空字符串.在StringIO的情况下,这恰好是二进制字符串.虽然我没有找到关于这个特定情况的任何文档,但它在MRI的StringIO类代码中有明确的定义.
a.read
因此将以二进制编码返回空字符串.
本文共计357个文字,预计阅读时间需要2分钟。
为什么在下面的代码中我得到不同的编码?
pythonrequire 'stringio'a=StringIO.new('toto')a.read(2)a.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> 让我们剖析你的代码……
a.read(2)
这将从流中读取两个字节并返回一个String.当您读取特定数量的字节时,Ruby无法保证任何字符边界.因此,它指定返回的字符串将通过二进制编码,即编码:ASCII-8BIT.
在下一行中,您正在使用
a.read
因此,您将读取直到流的末尾并返回所有剩余数据.返回字符串的编码可以作为read方法的参数给出,也可以默认为定义的外部编码(在您的情况下为UTF-8).
现在,当您已读到流的末尾时,任何后续读取都将导致错误或仅返回空字符串.在StringIO的情况下,这恰好是二进制字符串.虽然我没有找到关于这个特定情况的任何文档,但它在MRI的StringIO类代码中有明确的定义.
a.read
因此将以二进制编码返回空字符串.

