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 に、適切に変換する関数を提供します。
第一引数がレファレンスの場合、それは 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)
shiftjis_to_unicode([SJIS_CALLBACK,] STRING)
SVf_UTF8
フラグ付きの Perlの内部形式, perlunicode を参照。)
shiftjis_to_utf16le([SJIS_CALLBACK,] STRING)
shiftjis_to_utf16be([SJIS_CALLBACK,] STRING)
shiftjis_to_utf32le([SJIS_CALLBACK,] STRING)
shiftjis_to_utf32be([SJIS_CALLBACK,] STRING)
第一引数がレファレンスの場合、それは 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)
unicode_to_shiftjis([UNICODE_CALLBACK,] STRING)
この Unicode は、Perl の内部形式(perlunicode 参照)。
SVf_UTF8
フラグ付きでない場合、ISO 8859-1 (latin1) 文字列として
Unicode に upgrade されます。
utf16_to_shiftjis([UNICODE_CALLBACK,] STRING)
BOM
付きまたは無し) を Shift_JIS に変換します。
utf16le_to_shiftjis([UNICODE_CALLBACK,] STRING)
utf16be_to_shiftjis([UNICODE_CALLBACK,] STRING)
utf32_to_shiftjis([UNICODE_CALLBACK,] STRING)
BOM
付きまたは無し) を Shift_JIS に変換します。
utf32le_to_shiftjis([UNICODE_CALLBACK,] STRING)
utf32be_to_shiftjis([UNICODE_CALLBACK,] STRING)
デフォルト:
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.