我正在阅读《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上尝试了以下简单脚本,它们都将7位ASCII字符解码为UTF-8。
我猜可能是在Ruby 1.9的开发过程中改变了这种行为。我试图搜索Ruby 1.9的更改记录,1.9.1 changelog证实了这一点。我也克隆了Ruby的GIT存储库,但找不到提到更改此行为的提交。
更新:
查看Ruby的源代码存储库,我想这就是Ruby 1.9.0中的行为,该版本于2008年1月发布。(它无法在Debian 6上编译,因此我无法完全确认这一点。)虽然《Ruby编程语言》是一本精彩的书,但它最初是在2008年出版的。这本书中的某些描述很可能已经过时了。
另一个过时的描述是关于Encoding.list方法的行为。因此,如果您也正在阅读这本书,请注意过时的描述。
如果一个字符串文字只包含7位ASCII字符,则其编码方法将返回ASCII,即使源编码为UTF-8。
我在ruby 1.9.1-p431、1.9.2和1.9.3-p125上尝试了以下简单脚本,它们都将7位ASCII字符解码为UTF-8。
# 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上编译,因此我无法完全确认这一点。)虽然《Ruby编程语言》是一本精彩的书,但它最初是在2008年出版的。这本书中的某些描述很可能已经过时了。
另一个过时的描述是关于Encoding.list方法的行为。因此,如果您也正在阅读这本书,请注意过时的描述。
s.bytes
进行检查。不过,按定义,7位字符在 UTF-8 中存储时不会改变。 - tadman[]
进行索引必须从字符串开头遍历。如果去除了ASCII-8BIT优化,我猜可能会有其他优化来避免这种情况。 - cyfdecyf