我刚开始学习Ruby(最终转向RoR),但我刚刚被告知Ruby不支持unicode。这是真的吗? Ruby程序员如何支持unicode?
答案 0 :(得分:31)
您听到的内容已过时并且(仅部分)适用于Ruby 1.8或之前。 Ruby(1.9)的最新稳定版本支持不少于 95 不同的字符编码(刚才我的系统统计)。这包括几乎所有已知的Unicode转换格式,包括UTF-8 。
之前稳定版本的Ruby(1.8)对UTF-8有部分支持。
如果您使用Rails,它会为您处理默认的UTF-8编码。如果您只需要UTF-8编码感知,Rails将为您工作无论您运行Ruby 1.9还是Ruby 1.8 。如果你有非常特殊的字符编码要求,你应该瞄准Ruby 1.9。
如果你真的很感兴趣,这里有一个series of articles来描述Ruby 1.8中的编码问题以及它们是如何解决的,并最终在Ruby 1.9中得到解决。 Rails仍然包含Ruby 1.8中许多常见缺陷的解决方法。
答案 1 :(得分:15)
在我的文件顶部添加以下行解决了它。
# encoding: utf-8
答案 2 :(得分:14)
那不是真的。真实的是,Ruby不支持仅 Unicode,它也支持大量其他编码。
这与Java,.NET或Python之类的系统形成对比,后者遵循“One Encoding To Rule Allm”模型。 Ruby拥有Ruby的m17n系统的设计者之一称为“CSI”模型(Code Set Indepedent),这意味着不是所有字符串都只有一个相同的编码,每个字符串都用自己的编码标记。
这对于易用性和性能都有一些显着的优势,因为这意味着如果您的输入和输出编码相同,您永远不需要转码,而使用One True Encoding模型,您需要转码两次最糟糕的情况(不幸的是,最坏的情况经常发生,因为大多数这些环境选择了一个没有人实际使用的内部编码),从输入编码到内部编码再到输出编码。在Ruby中,您最多需要转码一次。
OTE模型的基本问题是,无论您选择哪种编码作为One True Encoding,它都将是一个完全随意的选择,因为根本没有一个编码,每个人,甚至大多数人使用。< / p>
例如,在Java中,他们选择UCS-2作为One True Encoding。然后,几年后,事实证明UCS-2实际上还不足以对所有字符进行编码,因此他们必须对Java进行向后不兼容的更改,以切换到UTF-16作为One True Encoding。除此之外,世界上很大一部分人已经从UTF-16转向UTF-8。如果Java是几年前发明的,那么他们可能会选择ASCII作为One True Encoding。如果它是在另一个国家发明的,它可能是Shift-JIS。如果它是由另一家公司发明的,它可能是EBCDIC。它真的完全是任意的,而这样一个重要的选择不应该。
答案 3 :(得分:5)
这是一个很老的问题。目前Ruby的稳定版本是2.0.1。是的,它处理大多数你可以在其中输入的内容,但请注意它很容易破坏。
查看此代码示例和结果(受this启发):
["noël","","baffle"].each do |str|
puts "Result for '#{str}'"
puts " Size: #{str.size}"
puts " Reverse: [#{str.reverse}]"
puts " Uppercase: [#{str.upcase}]"
end
Result for 'noël'
Size: 5 << bad size
Reverse: [l̈eon] <= accent is shifted
Uppercase: [NOËL]
Result for ''
Size: 2
Reverse: []
Uppercase: []
Result for 'baffle'
Size: 4
Reverse: [efflab] <= doesn't really make sense
Uppercase: [BAfflE] <= should be "ELFFAB"
重点是:现代Ruby处理基础知识 - 不应该依赖更高级的字符串功能。
答案 4 :(得分:0)
在另一个问题的this answer中,有人说他们在处理Ruby 1.9中的unicode数据时遇到了Iconv的问题,但我无法保证其准确性。