(转)ruby中日本文字的编码变换

 

日本文字的编码变换

在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

原文地址:https://www.cnblogs.com/guilin-hu/p/3360560.html