加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 01:35:39 所属栏目:百科 来源:网络整理
导读:为什么在下面的代码中我得到不同的编码? 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) 这
为什么在下面的代码中我得到不同的编码?

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读