模块 NKF

NKF - 用于网络汉字过滤器的 Ruby 扩展

描述

这是 nkf (网络汉字过滤器) 的 Ruby 扩展版本。它转换第一个参数并返回转换后的结果。转换细节通过第一个参数中的标志指定。

Nkf 是一种用于网络、主机和终端之间的汉字编码转换器。它将输入的汉字编码转换为指定的汉字编码,例如 ISO-2022-JP、Shift_JIS、EUC-JP、UTF-8 或 UTF-16。

nkf 最独特的功能之一是猜测输入的汉字编码。它目前可以识别 ISO-2022-JP、Shift_JIS、EUC-JP、UTF-8 和 UTF-16。因此,用户无需显式设置输入汉字编码。

默认情况下,X0201 假名会被转换为 X0208 假名。对于 X0201 假名,支持 SO/SI、SSO 和 ESC-(-I 方法。对于自动代码检测,nkf 假设 Shift_JIS 中没有 X0201 假名。要接受 Shift_JIS 中的 X0201,请使用 -X-x-S

标志

-b -u

输出是缓冲的(默认),输出是无缓冲的。

-j -s -e -w -w16 -w32

输出编码为 ISO-2022-JP (7bit JIS)、Shift_JIS、EUC-JP、UTF-8N、UTF-16BE、UTF-32BE。如果没有此选项和编译选项,则假定为 ISO-2022-JP。

-J -S -E -W -W16 -W32

输入假设为 JIS 7 位、Shift_JIS、EUC-JP、UTF-8、UTF-16、UTF-32。

-J

假设 JIS 输入。它也接受 EUC-JP。这是默认设置。此标志不排除 Shift_JIS。

-S

假设 Shift_JIS 和 X0201 假名输入。它也接受 JIS。EUC-JP 被识别为 X0201 假名。如果没有 -x 标志,X0201 假名(半角假名)将被转换为 X0208。

-E

假设 EUC-JP 输入。它也接受 JIS。与 -J 相同。

-t

不转换。

-i_

指定 JIS 汉字的输出序列。(默认 B)

-o_

指定 ASCII 的输出序列。(默认 B)

-r

{解密/加密} ROT13/47

-h[123] –平假名 –片假名 –片假名-平假名

-h1 –平假名

片假名转换为平假名。

-h2 –片假名

平假名转换为片假名。

-h3 –片假名-平假名

片假名转换为平假名,平假名转换为片假名。

-T

文本模式输出 (MS-DOS)

-l

ISO8859-1 (Latin-1) 支持

-f[m [- n]]

在行中以 m 长度折叠,边距为 n。如果没有此选项,折叠长度为 60,折叠边距为 10。

-F

保留换行符的行折叠。

-Z[0-3]

将 X0208 字母(全角字母)转换为 ASCII

-Z -Z0

将 X0208 字母转换为 ASCII

-Z1

将 X0208 空格转换为单个 ASCII 空格。

-Z2

将 X0208 空格转换为双 ASCII 空格。

-Z3

将全角 >、<、"、& 替换为 HTML 中的 '&gt;'、'&lt;'、'&quot;'、'&amp;'。

-X -x

假设 MS-Kanji 中存在 X0201 假名。使用 -X 或不使用此选项,X0201 将被转换为 X0208 假名。使用 -x,尝试保留 X0208 假名,并且不将 X0201 假名转换为 X0208。在 JIS 输出中,使用 ESC-(-I。在 EUC 输出中,使用 SSO。

-B[0-2]

假设破损的 JIS-Kanji 输入,该输入丢失了 ESC。当您的站点使用旧的 B-News Nihongo 补丁时很有用。

-B1

允许 ESC-( 或 ESC-$ 之后的任何字符。

-B2

强制在 NL 之后使用 ASCII

-I

将非 iso-2022-jp 字符替换为 geta 字符(日语中的替换字符)。

-d -c

删除换行符中的 r,在换行符中添加 r。

-m[BQN0]

MIME ISO-2022-JP/ISO8859-1 解码。(默认)要查看 ISO8859-1 (Latin-1),则必须使用 -l。

-mB

解码 MIME base64 编码的流。在转换之前删除标头或其他部分。

转换。

-mQ

解码 MIME 引用的流。引号流中的“_”被转换为空格。

-mN

非严格解码。

它允许在 base64 编码的中间断行。

-m0

无 MIME 解码。

-M

MIME 编码。标头样式。所有 ASCII 代码和控制字符保持不变。在编码之前执行汉字转换,因此不能将其用作图片编码器。

-MB

MIME 编码 Base64 流。

-MQ

执行引用编码。

-l

输入和输出代码为 ISO8859-1 (Latin-1) 和 ISO-2022-JP。-s-e-x 与此选项不兼容。

-L[uwm]

换行模式。如果没有此选项,nkf 将不会转换换行符。

-Lu

unix (LF)

-Lw

windows (CRLF)

-Lm

mac (CR)

–fj –unix –mac –msdos –windows

为这些系统转换

–jis –euc –sjis –mime –base64

为指定的代码转换

–jis-input –euc-input –sjis-input –mime-input –base64-input

假设输入系统

–ic=输入字符集 –oc=输出字符集

设置输入或输出字符集。NKF 支持以下字符集,并且这些字符集名称不区分大小写。

ISO-2022-JP

又名 RFC1468,7bit JIS, JUNET

EUC-JP (eucJP-nkf)

又名 AT&T JIS, 日本 EUC, UJIS

eucJP-ascii

又名 x-eucjp-open-19970715-ascii

eucJP-ms

又名 x-eucjp-open-19970715-ms

CP51932

Microsoft 版本的 EUC-JP。

Shift_JIS

SJIS, MS-Kanji

Windows-31J

又名 CP932

UTF-8

与 UTF-8N 相同

UTF-8N

不带 BOM 的 UTF-8

UTF-8-BOM

带 BOM 的 UTF-8

UTF-16

与 UTF-16BE 相同

UTF-16BE

不带 BOM 的 UTF-16 大端

UTF-16BE-BOM

带 BOM 的 UTF-16 大端

UTF-16LE

不带 BOM 的 UTF-16 小端

UTF-16LE-BOM

带 BOM 的 UTF-16 小端

UTF-32

与 UTF-32BE 相同

UTF-32BE

不带 BOM 的 UTF-32 大端

UTF-32BE-BOM

带 BOM 的 UTF-32 大端

UTF-32LE

不带 BOM 的 UTF-32 小端

UTF-32LE-BOM

带 BOM 的 UTF-32 小端

UTF8-MAC

NKDed UTF-8,又名 UTF8-NFD(仅限输入)

–fb-{跳过, html, xml, perl, java, subchar}

指定 nkf 处理未分配字符的方式。如果没有此选项,则假定为 –fb-skip。

–prefix= 转义字符 目标字符 ..

当 nkf 转换为 Shift_JIS 时,nkf 会向 Shift_JIS 字符的指定第二个字节添加指定的转义字符。参数的第一个字节是转义字符,后面的字节是目标字符。

–no-cp932ext

将 CP932 中扩展的字符作为未分配字符处理。

–no-best-fit-chars

当进行 Unicode 到编码字节转换时,请勿转换不是往返安全的字符。当进行 Unicode 到 Unicode 转换时,使用此选项和 -x 选项,nkf 可以用作 UTF 转换器。(换句话说,如果没有此选项和 -x 选项,nkf 将不会保存某些字符)

当 nkf 转换与路径相关的字符串时,您应该使用此选项。

–cap-input

解码十六进制编码的字符。

–url-input

取消转义百分号转义的字符。

忽略其余的 -option。

常量

ASCII
AUTO
BINARY
EUC
GEM_VERSION

nkf 库的版本

JIS
NKF_RELEASE_DATE

nkf 的发布日期

NKF_VERSION

nkf 版本

NOCONV
SJIS
UNKNOWN
UTF16
UTF32
UTF8
版本

nkf 的完整版本字符串

公共类方法

guess(str) → encoding 点击切换源代码

通过 nkf 例程返回对 str 的猜测编码。

static VALUE
rb_nkf_guess(VALUE obj, VALUE src)
{
    reinit();

    input_ctr = 0;
    input = (unsigned char *)StringValuePtr(src);
    i_len = RSTRING_LENINT(src);

    guess_f = TRUE;
    kanji_convert( NULL );
    guess_f = FALSE;

    return rb_enc_from_encoding(rb_nkf_enc_get(get_guessed_code()));
}
nkf(opt, str) → string 点击切换源代码

转换 str 并返回转换结果。转换细节由 opt 指定,为 String 类型。

require 'nkf'
output = NKF.nkf("-s", input)
static VALUE
rb_nkf_convert(VALUE obj, VALUE opt, VALUE src)
{
    VALUE tmp;
    reinit();
    nkf_split_options(StringValueCStr(opt));
    if (!output_encoding) rb_raise(rb_eArgError, "no output encoding given");

    switch (nkf_enc_to_index(output_encoding)) {
    case UTF_8_BOM:    output_encoding = nkf_enc_from_index(UTF_8); break;
    case UTF_16BE_BOM: output_encoding = nkf_enc_from_index(UTF_16BE); break;
    case UTF_16LE_BOM: output_encoding = nkf_enc_from_index(UTF_16LE); break;
    case UTF_32BE_BOM: output_encoding = nkf_enc_from_index(UTF_32BE); break;
    case UTF_32LE_BOM: output_encoding = nkf_enc_from_index(UTF_32LE); break;
    }
    output_bom_f = FALSE;

    incsize = INCSIZE;

    input_ctr = 0;
    input = (unsigned char *)StringValuePtr(src);
    i_len = RSTRING_LENINT(src);
    tmp = rb_str_new(0, i_len*3 + 10);

    output_ctr = 0;
    output     = (unsigned char *)RSTRING_PTR(tmp);
    o_len      = RSTRING_LENINT(tmp);
    *output    = '\0';

    /* use _result_ begin*/
    result = tmp;
    kanji_convert(NULL);
    result = Qnil;
    /* use _result_ end */

    rb_str_set_len(tmp, output_ctr);

    if (mimeout_f)
        rb_enc_associate(tmp, rb_usascii_encoding());
    else
        rb_enc_associate(tmp, rb_nkf_enc_get(nkf_enc_name(output_encoding)));

    return tmp;
}