关于RUBY处理多语言转字符编码的一点经验 nkf

最近做了一个用户上传文件,然后在服务器端解析上传文件的功能,由于不知道用户上传文件的编码类型所以必须进行强制转换。

原本用的方法是:

Iconv.conv('utf-8' , 'cp932', string)

这样可以强制把 'cp932'的字符编码转换为'utf-8'。过了阵子出现某些上传文件开头部分出现莫名字符的问题。查了一下,如果输入的是有签名的UTF-8就会出错

UTF-8签名(UTF-8 signature)也叫做BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记。如果多个文件设置了签名,在二进制流中就会包含多个UTF-8签名,而IE是无法识别多个UTF-8签名的,所以用一个空行来代替,在某些程序处理中还会出现一个类似“诺”的字符。

Iconv.conv只能将一种字符编码转换为另外一种,很不方便

后来发现ruby后来又加入了一个叫NKF类,可以将任何其他编码转换为指定的编码格式,这样就能彻底解决我的问题。

例: string= NKF.nkf("-w", string)

nkf库文件介绍:

nkf库文件由NKF模块提供。NKF模块原是用于UNIX而制作的nkf(Network Kanji code conversion Filter)的过滤器指令,现在在Ruby中也用得到。

在NKF模块中,通过指定文件编码,使用类似命令行选项的字符串。

NKF.nkf(可选字符串, string)

nkf的主要选项可参看下表:

选项 意义

-d 在换行文字中删除CR

-c 在换行文字中增加CR

-x 不对半角假名进行转换

-m0 限制对MIME的处理

-e 输出文字编码方式为EUC-JP

-s 输出文字编码方式为Shift_JIS

-j 输出文字编码方式为ISO-2022-JP

-w 输出文字编码方式为UTF-8(无BOM)

-w8 输出文字编码方式为UTF-8(有BOM)

-w80 输出文字编码方式为UTF-8(无BOM)

-w16 输出文字编码方式为UTF-16(Big Endian/无BOM)

-w16B 输出文字编码方式为UTF-16(Big Endian/有BOM)

-w16B0 输出文字编码方式为UTF-16(Big Endian/无BOM)

-w16L 输出文字编码方式为UTF-16(Little Endian/有BOM)

-w16L0 输出文字编码方式为UTF-16(Little Endian/无BOM)

-E 输出文字编码方式为EUC-JP

-S 输出文字编码方式为Shift_JIS

-J 输出文字编码方式为ISO-2022-JP

-W 输出文字编码方式为UTF-8(无BOM)

-W8 输出文字编码方式为UTF-8(有BOM)

-W80 输出文字编码方式为UTF-8(无BOM)

-W16 输出文字编码方式为UTF-16(Big Endian/无BOM)

-W16B 输出文字编码方式为UTF-16(Big Endian/有BOM)

-W16B0 输出文字编码方式为UTF-16(Big Endian/无BOM)

-W16L 输出文字编码方式为UTF-16(Little Endian/有BOM)

-W16L0 输出文字编码方式为UTF-16(Little Endian/无BOM)