Ruby支持unicode吗?它是如何工作的?

时间:2010-11-10 21:44:05

标签: ruby unicode

我刚开始学习Ruby(最终转向RoR),但我刚刚被告知Ruby不支持unicode。这是真的吗? Ruby程序员如何支持unicode?

5 个答案:

答案 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的问题,但我无法保证其准确性。