ruby/rails中的中文处理

ruby/rails中的中文处理

转的-:)
---------------------------------------

由于当前的ruby并不支持unicode, 所以中文相关的处理在ruby中一直比较模糊,基本上是各自尝试的路子, 我也列出一些帮助自己整理思路

utf8和unicode的关系

utf其实是(Unicode Translation Format), 也就是unicode在传输时候的编码, 有utf8和utf16等多种编码, 其实uf8是一个对中文字很不友好的编码, 为什么呢,因为在utf8中, 一个中文是占用3个字节,而一个英文ascii字符却只占用1个字节, 这样一方面使得中文体积膨胀较厉害, 另外一方面也不能简单的通过计算字节数来推算字符数. utf16就比较正常, 每个字符占用两个字节.但是目前utf16已经后面的utf32应用较少, utf8 是比较公认的编码

utf8 还是 gb2312/gbk

我个人选择utf8,因为我觉得gb2312/gbk不是通用编码,如果使用可能还会有其他问题(比如多语言支持)

转换编码

我们需要require 'iconv' 库, 然后执行

Iconv.conv("utf8","GBK","....") #把字符由GBK转换为UTF8

当源字符集中含有非法编码的时候,我们需要告诉iconv忽略, 否则iconv会报错停止

Iconv.conv("utf8//IGNORE","GBK//IGNORE","....")

utf8 的中文操作:

计算字符数:

在默认的ruby环境下面, 需要执行


require 'jcode'

$KCODE='u' # 或者$KCODE='UTF8' 两者是等价的

计算字符数:

使用jsize或者jlength

"你好".size # 6

"你好".jsize # 2

截取字符操作

"你好"[0,1] #乱码

"你好".scan(/./)[0,1].join # "你"


当然还有另外一个办法:

利用utf16编码每个字都是2个字节(头还有两个字节)的特点,我们可以先把字符转换为utf16,然后按照[0,n*2+2]的方法截取前n个字符 (试验成功.求证中)

Iconv.conv("UTF8","UTF16",Iconv.conv("UTF16","UTF8","你好a中b文")[0,8]) #你好a
等1.9吧。就支持UTF8了。目前的办法都不是最终的解决之道。
只能等了。。。
1.9应该有不少的改变,值得期待的。