[译]总结:如何用Ruby处理Unicode,FAQ

作者:半瓶墨水   链接:http://www.2maomao.com/blog/fanyi-ruby-unicode-faq/

关于Ruby如何处理Unicode,找资料找了好久。在Google groups邮件新闻组comp.lang.ruby里面搜索到这个超长的mail thread:

有位兄弟在维护这个超长的mail thread一阵子之后不堪重负:

天哪,我真的没精力继续打理这个mail thread了,总有人问Unicode的事儿。
Chad:如果你找到了一个直截了当的解决方案麻烦通知我一下。
其他人:有没有一个简单的、直截了当的FAQ能告诉大家:“如果你想用Ruby处理Unicode,你可以这么这么这么做。。。”

于是Charles O Nutter同志本着为人民服务的精神总结如下:

下面说的不是一个完整的答案,但我已经尽力啦。如果你真的想要解决这个问题,可以阅读一下Julian Tarkhanov’sUNICODE_PRIMER

※※※ Onigurama ※※※
首先,Onigurama(一个正则表达式引擎,ruby1.9开始采用)支持Unicode,也支持许多encoding,很好用,如果你只是想用搜索一下字符串,OK,就是它了。(按:不知道如何使用啊。。。)

※※※ jcode类库 ※※※
Ruby的String类是不区分unicode的. 有个叫做jcode的库,很简单,比如你只是想数一下一个UTF-8字符串中有多少个字符,或者遍历这些字符。

※※※ /./u 正则表达式 ※※※
Ruby本身也有一些处理UTF-8(使用正则表达式)的能力:使用’u’作为修饰。许多人hack UTF-8的主要方法就是str.scan(/./u),这样就返回了一个字符串数组,里面每个字符串中的若干字节代表一个UTF-8字符。(另:str.unpack(‘U*’))

※※※ unicode_hacks ※※※
如果你想在Rails里面用Unicode字符串,可以使用Julian的unicode_hacks插件,他们在irc.freenode.net上有个专门的channel:#multibyte_rails
unicode_hacks 插件很有想法,它会在使用str.unpack(‘U*’)之前先尝试用下面这些扩展来做(按优先级顺序排列):
    1. icu4r: IBM ICU库的Ruby扩展,添加了诸如UString, URegexp等类来处理Unicode。(文档链接)
    2. utf8proc: 一个很小型的库,便利字符串中的的字符然后一个个转过去,给String类和Interger类添加了了一些方法,比如String#utf8map和Integer#utf8。
  3. Unicode类: Yoshida Masato 做的一个扩展,提供`strcmp`, `[de]compose`, normalization 和大小写转换等功能。

看起来很多选择,很丰富,但是大都只实现了部分功能,而且都只刚刚开始,还不成熟。

※※※ Ruby-Character-Encoding ※※※
最近刚刚个东东加入了这场Unicode竞争:Nikolai Weibull的ruby-character-encoding库,意图在Ruby 1.8的string类上添加功能解决Matz想要在Ruby2.0才给于解决的Unicode问题(按:Ruby1.9 2007年年底才出,Ruby2.0等到哪辈子?),但是如果你使用这个类,就有可能导致其他使用标准string类的库崩溃。不过,在Nikolai的努力下,这个库倒有希望完美的解决Unicode问题。有个邮件列表专门讨论这个

呵呵有点胡拼乱凑啦,不过总比成天Google,然后下载解压、阅读Readme文件要来的快一些。

最后给大家来串葡萄(按:原图片缺失,为什么是葡萄?难道这位大虾也是星迷?)来搞个签名好了
ruby_grape

翻译有些粗糙,错误之处还请指出,原文参见:
http://groups.google.com/group/comp.lang.ruby/msg/ee2e0645c49e3a96

标签:[tag]ruby, Unicode[/tag]

7 条评论 发表在“[译]总结:如何用Ruby处理Unicode,FAQ”上

  1. hwx说道:

    这个总结只给出若干链接,用处不大啊。
    我遇到的一个问题是,用ruby(是ruby脚本程序,不是rails)读取的gb2312中文文本,
    写入到mysql数据库(utf8编码)总是乱码。用iconv转码也不行。。。
    晕死了。不知道还有没有其他转码办法。

  2. 兔毛猫说道:

    @hwx
    你用iconv转码的时候设置$KCODE了吗?其实写个专门的ruby程序用来做一下iconv转码的测试就会比较清楚原因了,以后用的时候也方便剪剪贴贴

  3. hwx说道:

    我那个转码的问题终于搞定了,iconv转码基本是正确的,我写入数据库原本用activerecord,好像对unicode支持很不好,后直接用mysql驱动(require ‘mysql’),写入数据库的就不再是乱码了。

  4. hwx说道:

    顺便说说,之前我转码的时候,在网上搜了一大通,kcode,jcode啥的都试过了,不行
    最后的结论是,用mysql驱动比activerecord好,我一开始觉得acitverecord简单才用它的,结果遇到中文就出了不少麻烦。

  5. 兔毛猫说道:

    @hwx
    多谢经验共享

  6. […] 六、参考资料 unicode.org iT wiki – Unicode iT wiki – UCS 编码又见编码 对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16,GBK,GB2312的理解 Java的中文处理学习笔记:Hello Unicode 中文字符编码简介 GB2312/GBK/GB18030/BIG5 [译]总结:如何用Ruby处理Unicode,FAQ Ruby参考手册 – 内部变量 […]

  7. […] Java的中文处理学习笔记:Hello Unicode 中文字符编码简介 GB2312/GBK/GB18030/BIG5 [译]总结:如何用Ruby处理Unicode,FAQ Ruby参考手册 – 内部变量 Tag: 字符集 […]

留下回复