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

寻技术 Ruby编程 2023年12月20日 151

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

原本用的方法是:

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)

 


 

关闭

用微信“扫一扫”