我正在阅读“Ruby编程语言”。在第3.2.6.1节“Ruby 1.9中的多字节字符”中,本书介绍了Ruby字符串中的优化
如果字符串文字只包含7位ASCII字符,则其编码方法将返回ASCII,即使源编码为UTF-8
我在ruby 1.9.1-p431,1.9.2和1.9.3-p125上尝试了以下简单脚本,两者都使用UTF-8编码为7位ASCII字符。
# coding: utf-8
s = 'hello'
p s.encoding
# result is #<Encoding:UTF-8>
我想在Ruby 1.9的开发过程中可能会改变这种行为。我试图搜索Ruby 1.9的更改日志,1.9.1 changelog确认了这种行为。我还克隆了Ruby的git存储库,但是我找不到提交有关改变这种行为的提交。
更新
看看Ruby的源代码库,我想这是Ruby 1.9.0中的行为,它于2008年1月发布。(它无法在Debian 6上编译,所以我无法确切地证实这一点。)虽然“红宝石编程语言”是一本优秀的书,但它最初是在2008年出版的。本书中的一些描述很可能已经过时了。
另一个过时的描述是关于Encoding.list
方法行为。因此,如果您还在阅读本书,请注意过时的描述。
答案 0 :(得分:4)
我没有那本书,但目前编程Ruby书籍(镐)的Pdf版本陈述
字符串文字总是使用包含它们的源文件的编码进行编码,而不管字符串的内容是什么
然后举例说明"dog"
获得utf-8编码。看起来你所拥有的书的版本是错误的。无论是你的书的印刷版本中的勘误表还是印刷后ruby改变的事实,我都不知道
答案 1 :(得分:2)
重要的是要注意Ruby中的“encoding”通常比存储的实际字节更多地引用“解释”。当它说编码是UTF-8时,这意味着该字符串中的字节将被解释为UTF-8多字节字符,但是假设UTF-8在设计上与7位ASCII向后兼容,那么在二元水平上没有明显的差异。
Ruby不会自动检测字符串的编码,因为没有标准甚至可靠的方法来确定它。这就是默认编码方法应用于所有字符串的原因,除非在创建或转换时明确指定。
您可以切换字符串的编码,而无需使用force_encoding
实际修改存储的字节。您还可以使用encode
转换为其他格式,可能会重新映射存储的字节。
如果您想了解有关字符串内部的更多信息,可以使用以下几种方法进行探索:
'dog'.encoding
# => #<Encoding:UTF-8>
'dog'.bytes.to_a
# => [100, 111, 103]
'dog'.chars.to_a
# => ["d", "o", "g"]
与非7位ASCII字符串比较:
'døg'.encoding
# => #<Encoding:UTF-8>
'døg'.bytes.to_a
# => [100, 195, 184, 103]
'døg'.chars.to_a
# => ["d", "ø", "g"]