4

我正在阅读“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 编码。

# coding: utf-8
s = 'hello'
p s.encoding
# result is #<Encoding:UTF-8>

我想也许这种行为在 Ruby 1.9 的开发过程中发生了变化。我尝试搜索 Ruby 1.9 的变更日志,1.9.1 的变更日志证实了这种行为。我还克隆了 Ruby 的 git 存储库,但我找不到提到更改此行为的提交。

更新:

查看 Ruby 的源代码存储库,我猜这是 2008 年 1 月发布的 Ruby 1.9.0 中的行为。(它无法在 Debian 6 上编译,所以我无法完全确认。)虽然“The Ruby Programming 《语言》是一本优秀的书,最初出版于2008年。很可能书中的一些描述已经过时了。

另一个过时的描述是关于Encoding.list方法行为的。因此,如果您也在阅读这本书,请注意过时的描述。

4

2 回答 2

4

我没有那本书,但是当前 Pdf 版本的 Programming Ruby 书(镐)状态

无论字符串的内容如何,​​字符串文字总是使用包含它们的源文件的编码进行编码

然后给出一个"dog"获得 utf-8 编码的例子。看起来你的书的版本是错误的。这是你的书印刷版中的勘误表,还是只是印刷后 ruby​​ 发生了变化,我不知道

于 2012-04-25T12:12:01.627 回答
2

需要注意的是,Ruby 中的“编码”通常指的是“解释”,而不是实际存储的字节。当它说编码是 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"]
于 2012-04-25T14:32:34.887 回答