日本文字的编码变换
在Ruby中,实现文字编码变换的库文件有nkf库文件和iconv库文件。
◆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) |
为了规避半角到全角的转换,或者电子邮件特有字符串处理之类的错误,在简单文字编码场合,通常使用-x和-m0选项(也可以写作-xm0)。我们看下面的将文字编码从EUC-JP转换为UTF-8的场合。
require "nkf"
euc_str = "日本语EUC"
utf8_str = NKF.nkf("-E –w –xm0", euc_str)
如果预先没有指定输入文字的编码方式,NKF会自动判别其编码,具体的例子如下:
require "nkf"
euc_str = "日本语EUC文字列"
utf8_str = NKF.nkf(" –w –xm0", euc_str)
作为独立的库文件,nkf不依赖于操作系统,因此在Ruby的各种环境中都能使用nkf。
◆iconv库文件
iconv库由iconv类提供。该库由系统平台提供,并用作文字编码的变换上。
iconv不能进行输入文字的编码的自动判别,因此输入文字和输出文字的编码格式都需要预先指定。变换开始时,通过iconv.new方法生成变换器,然后在iconv里实施编码变换,最后返回变换的结果。变换器使用结束后需要用close方法关闭它。
下面的例子是EUC-JP的字符串转换为UTF-8的例子,文字编码指定要遵循“输出编码,输入编码”的顺序。
require "iconv"
result = ""
cd = Iconv.open("UTF-8", "EUC-JP")
result << cd.iconv("あ")
result << cd.iconv("い")
result << cd.iconv("う")
cd.close
如果对File.open指定操作范围(注:{}中部分)的话,可以不需要close方法。
require "iconv"
result = ""
Iconv.open("UTF-8", "EUC-JP"){|cd|
result << cd.iconv("あ")
result << cd.iconv("い")
result << cd.iconv("う")
}
此外,可以不显式地生成变换器,直接使用Iconv.conv来完成编码变换。
require "iconv"
euc_str = "日本语EUC文字列"
utf8_str = Iconv.conv("UTF-8", "EUC-JP", euc_str)
iconv类功能与平台紧密相关,因此iconv库依赖于系统平台。也就是说,在不同的系统平台上,会出现同样的编码但名称不同的现象。还好,对于日语中文字编码来说,一般情况下电子邮件、Web一般采用“ISO-2022-JP”、“EUC-JP”、“SHIFT_JIS”、“UTF-8”的文字编码形式的场合要多一些。
如果想知道iconv库能处理哪些文字编码,可以使用下面的命令查看。
> iconv -l