最近做了一个用户上传文件,然后在服务器端解析上传文件的功能,由于不知道用户上传文件的编码类型所以必须进行强制转换。
原本用的方法是:
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)