名称

ShiftJIS::JISX0208::MapUTF - Shift_JIS (JIS X 0208の附属書1に規定) と Unicode との変換


概要

    use ShiftJIS::JISX0208::MapUTF;
    $utf8_string = shiftjis_to_utf8($sjis_string);
    $sjis_string = utf8_to_shiftjis($utf8_string);


説明

Shift_JIS のテーブルは 7070 文字からなります。

    JIS X 0201 一バイト文字(191 文字)
    JIS X 0208 二バイト文字(6879 文字)

このモジュールは、Shift_JIS から Unicode に、また、 Unicode から Shift_JIS に、適切に変換する関数を提供します。

Shift_JIS から Unicode への変換

第一引数がレファレンスの場合、それは SJIS_CALLBACK として、 Unicode への対応がない Shift_JIS 文字の処理に用いられます。 (STRING にレファレンスを与えることはできません。)

SJIS_CALLBACK が与えられている場合、 第二引数が STRING として用いられます。 さもなければ第一引数が STRING になります。

もし SJIS_CALLBACK が与えられていない場合、 Unicode への対応がない Shift_JIS 文字は黙って削除され、 部分文字は一バイト分跳ばされます。 SJIS_CALLBACK として、常に空文字列を返す コードリファレンス (sub {''}) が渡されたかのように動作します。

今のところ、SJIS_CALLBACK としては、 コードリファレンスのみが使えます。 コードリファレンスの返り値がマッピングのない文字の代わりに挿入されます。

コードリファレンス SJIS_CALLBACK は、一個以上の引数とともに 呼び出されます。

不法なバイト(第二バイト ([0x40..0x7E, 0x80..FC]) を伴わない 第一バイト [0x81..0x9F, 0xE0..0xEF]、 あるいは保留域のバイト ([0x80, 0xA0, 0xF0..0xFF]),

マッピングのない文字が部分的な二バイト文字 (第一バイトのみの一バイト長の文字列)の場合、 第一引数は未定義値(undef)になり、 第二引数はバイトを表す符号なし整数値になります。 空き領域の文字が現れた場合、第一引数は、文字を表す文字列になります。

    my $sjis_callback = sub {
        my ($char, $byte) = @_;
        return function($char) if defined $char;
        die sprintf "found partial byte 0x%02x", $byte;
    };

上記の例で、$char としては、"\x82\xf2", "\xef\xfc" などがあり得ます。

SJIS_CALLBACK の返り値は、変換先の形式に合わせなければなりません。 例えば、shiftjis_to_utf16be() とともに UTF-8 を返す SJIS_CALLBACK を使ってはいけません。 つまり、UTF ごとに、SJIS_CALLBACK を用意する必要があります。

shiftjis_to_utf8([SJIS_CALLBACK,] STRING)
Shift_JIS を UTF-8 に変換します。

shiftjis_to_unicode([SJIS_CALLBACK,] STRING)
Shift_JIS を Unicode に変換します。 (SVf_UTF8 フラグ付きの Perlの内部形式, perlunicode を参照。)

shiftjis_to_utf16le([SJIS_CALLBACK,] STRING)
Shift_JIS を UTF-16LE に変換します。

shiftjis_to_utf16be([SJIS_CALLBACK,] STRING)
Shift_JIS を UTF-16BE に変換します。

shiftjis_to_utf32le([SJIS_CALLBACK,] STRING)
Shift_JIS を UTF-32LE に変換します。

shiftjis_to_utf32be([SJIS_CALLBACK,] STRING)
Shift_JIS を UTF-32BE に変換します。

Unicode から Shift_JIS への変換

第一引数がレファレンスの場合、それは UNICODE_CALLBACK として、 Shift_JIS への対応がない Unicode 文字の処理に用いられます。 (STRING にレファレンスを与えることはできません。)

UNICODE_CALLBACK が与えられている場合、 第二引数が STRING として用いられます。 さもなければ第一引数が STRING になります。

もし UNICODE_CALLBACK が与えられていない場合、 Shift_JIS への対応がない Unicode 文字は黙って削除され、 また、部分文字は一バイト分跳ばされます。 UNICODE_CALLBACK として、常に空文字列を返す コードリファレンス (sub {''}) が渡されたかのように動作します。

今のところ、UNICODE_CALLBACK としては、 コードリファレンスのみが使えます。 そのコードリファレンスの返り値が マッピングのない文字の代わりに挿入されます。

コードリファレンス UNICODE_CALLBACK は、 一個以上の引数とともに呼び出されます。マッピングのない文字が 部分的文字(不正なバイト)の場合、第一引数は未定義値(undef)になり、 第二引数はバイトを表す符号なし整数値になります。 部分文字でなければ、第一引数は、Unicode文字の符号位置を表す 符号なし整数値になります。

例えば、Shift_JIS への対応がない文字を HTML 4.01 の数値文字参照に 変換する方法を示します。

    sub toHexNCR {
        my ($char, $byte) = @_;
        return sprintf("&#x%x;", $char) if defined $char;
        die sprintf "illegal byte 0x%02x was found", $byte;
    }
    $sjis_string = utf8_to_shiftjis   (\&toHexNCR, $utf8_string);
    $sjis_string = unicode_to_shiftjis(\&toHexNCR, $unicode_string);
    $sjis_string = utf16le_to_shiftjis(\&toHexNCR, $utf16le_string);

UNICODE_CALLBACK の返り値は Shift_JIS として正しくある必要があります。

utf8_to_shiftjis([UNICODE_CALLBACK,] STRING)
UTF-8 を Shift_JIS に変換します。

unicode_to_shiftjis([UNICODE_CALLBACK,] STRING)
Unicode を Shift_JIS に変換します。

この Unicode は、Perl の内部形式(perlunicode 参照)。 SVf_UTF8 フラグ付きでない場合、ISO 8859-1 (latin1) 文字列として Unicode に upgrade されます。

utf16_to_shiftjis([UNICODE_CALLBACK,] STRING)
UTF-16 (BOM 付きまたは無し) を Shift_JIS に変換します。

utf16le_to_shiftjis([UNICODE_CALLBACK,] STRING)
UTF-16LE を Shift_JIS に変換します。

utf16be_to_shiftjis([UNICODE_CALLBACK,] STRING)
UTF-16BE を Shift_JIS に変換します。

utf32_to_shiftjis([UNICODE_CALLBACK,] STRING)
UTF-32 (BOM 付きまたは無し) を Shift_JIS に変換します。

utf32le_to_shiftjis([UNICODE_CALLBACK,] STRING)
UTF-32LE を Shift_JIS に変換します。

utf32be_to_shiftjis([UNICODE_CALLBACK,] STRING)
UTF-32BE を Shift_JIS に変換します。

輸出

デフォルト:

    shiftjis_to_utf8     utf8_to_shiftjis
    shiftjis_to_utf16le  utf16le_to_shiftjis
    shiftjis_to_utf16be  utf16be_to_shiftjis
    shiftjis_to_unicode  unicode_to_shiftjis

要求されれば:

    shiftjis_to_utf32le  utf32le_to_shiftjis
    shiftjis_to_utf32be  utf32be_to_shiftjis
                         utf16_to_shiftjis [*]
                         utf32_to_shiftjis [*]

[*] これらと対応すべき shiftjis_to_utf16() および shiftjis_to_utf32() は未実装です。まだ SJIS_CALLBACK の返り値についてもう少し検討が 必要と考えています。 (文字列の連結に BOM の認識と処理が必要となるでしょう。)


作者

SADAHIRO Tomoyuki <SADAHIRO@cpan.org> (貞廣 知行)

  Copyright(C) 2002-2007, SADAHIRO Tomoyuki. Japan. All rights reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.


参考資料

JIS X 0208:1997
7ビット及び8ビットの2バイト情報交換用符号化漢字集合