Perl は Windows 語をしゃべれる

Perl 5.8 では日本語を含む多言語処理に関する実装が大幅に強化された。Windows 上で日本語処理を行うならば…


use encoding "shiftjis";


と宣言してやれば、その後の処理過程においてファイル入力を Shift_JISUTF-8、ファイル出力を UTF-8Shift_JIS と透過的に処理してくれる………そんな風に説明している HP は少なくない。実際のところ、私もそれらの説明を鵜呑みにしてしまい、そしてハマった。


この方法が上手くないのは、前回の記事から自明であろう。実際には Windows 上の日本語テキストは多くのベンダー拡張文字(機種依存文字、あるいはShift_JIS において未定義の文字)を含んでいる可能性があるわけで、入力ファイル中にそれらの文字を発見すると、Perl はこんな感じエラーを吐く(hig8loader.pl の出力例)…


shiftjis "\x87" does not map to Unicode at E:\HIG8\hig8loader.pl line 524, line 1191.


意訳すれば「その文字に対するマッピング規則は規定されてないから、UTF-8 へ変換することが出来ませんでしたよ」てな感じだろうか。


エラーが出てもそこで中断される訳ではなく、該当部分は「x87V50」とかいう感じの ASCII 文字列に置換されて、処理が継続される。そこさえ我慢すれば一応処理はできているわけだが、しかし実際のビジネス分野におけるテキストを想定すると、ファイル中にローマ数字や丸数字などのベンダー拡張文字が使用されている可能性は非常に高い。いわゆる「文字化け」に比較すればダメージは小さいとも言えるが、それを許容できるケースというのは限られているだろう。


ではどうすれば良いのか?


use encoding "cp932";


とすれば良い。
エンコーディングを意識せねばならないファンクション・ステートメントは幾らかあるが…


use Encode;

$text = decode ("cp932", $input);
$output = encode ("cp932", $text);


とか…


use open ":encoding(cp932)";


などはいずれも Perl 5.8 で有効だ(Active Perl 5.8.8 にて確認)。PerlWindows 語である CP932 を話せるのだ。


またもや当たり前の結論でゴメン。でも私がハマったということは、きっと私以外の誰かもまたハマる可能性があるんじゃまいかということで、一応書き残しておく。