package utf8ToSjis; require "utf8ToSjisTable.pl"; sub convert { # UTF-8 エンコードの 1 文字にマッチする正規表現 # 1 byte から 4 bytes まで対応 # $utf8char = '[\x00-\x7F]'; # 1 byte はどうせ変換しないので含めない $utf8ToSjis::utf8char = '[\xC2-\xDF][\x80-\xBF]'; # 2 bytes $utf8ToSjis::utf8char .= '|(?:\xE0[\xA0-\xBF]|[\xE1-\xEC\xEE\xEF][\x80-\xBF]|\xED[\x80-\x9F])[\x80-\xBF]'; # 3 bytes $utf8ToSjis::utf8char .= '|(?:\xF0[\x90-\xBF]|[\xF1-\xF3][\x80-\xBF]|\xF4[\x80-\x8F])[\x80-\xBF]{2}'; # 4 bytes $_[0] =~ s/($utf8ToSjis::utf8char)/&_charConvert($1)/ego; } sub _charConvert { # 変換 table に存在する場合、変換 table を使って変換する if (exists $utf8ToSjis::table{$_[0]}) { return $utf8ToSjis::table{$_[0]}; } # 変換 table に存在しない場合 else { # UTF-8 コードを返す my $charCode = unpack("H*", $_[0]); return ('%u' . $charCode); } } 1;