Encode.pm

Perl5.8ではEncode.pmという巨大な文字コード変換ライブラリが入っています。しかし、日本語の変換に際しては、さまざまな問題があります。

まずEUC-JPへと変換する場合の問題の回避策は以下の通り。

Encode($str, 'utf-8', 'EUC-JP', Encode::FB_HTMLCREF);
$str =~ s/∥/‖/go;
$str =~ s/~/〜/go;
$str =~ s/-/−/go;
$str =~ s/¢/¢/go;
$str =~ s/£/£/go;
$str =~ s/¬/¬/go;
$str =~ s/¦/釗/go;
$str =~ s/Ⅰ/Ⅰ/go;
$str =~ s/Ⅱ/Ⅱ/go;
$str =~ s/Ⅲ/Ⅲ/go;
$str =~ s/Ⅳ/Ⅳ/go;
$str =~ s/Ⅴ/Ⅴ/go;
$str =~ s/Ⅵ/Ⅵ/go;
$str =~ s/Ⅶ/Ⅶ/go;
$str =~ s/Ⅷ/Ⅷ/go;
$str =~ s/Ⅸ/Ⅸ/go;
$str =~ s/Ⅹ/Ⅹ/go;
$str =~ s/\x8f\xa2\xf1/№/go;
$str =~ s/℡/℡/go;
$str =~ s/㈱/㈱/go;

なお、Unicode系からShift_JISに変換したい時は、CP932を指定してやれば問題は起こらりません・・・が、EUC-JPからの場合は問題が起きるので、以下のように回避します。

Encode($str, 'EUC-JP', 'CP932', Encode::FB_HTMLCREF);
$str =~ s/‖/‖/go;
$str =~ s/〜/〜/go;
$str =~ s/−/−/go;
$str =~ s/\xfb\xbb/釗/go;

RubyではNKFを使えばこんなことはないので、安心しませう;)