PerlでShiftJISを読み込もうとしたらデコードできないと言われた件について

2chの過去ログで遊ぼうとPerlを使っていじっていたのです。
2chのファイルはShift-JISで書かれているわけですが、文字コードの違いとか面倒なのでPerlのIOレイヤを使ってUTF-8へ変換しようと

open my $datfile, "<:encoding(shift-jis)", "000000000.dat";
while(my $line=<$datfile>) {
    print $dat;
}

みたいな感じのプログラムを書いて変換してみた。

するとこんな警告でいっぱいになってしまったのです・・・。


shiftjis "\xF6" does not map to Unicode at adddat.pl line 55, <$datfile> line 39.
shiftjis "\xF7" does not map to Unicode at adddat.pl line 55, <$datfile> line 39.
shiftjis "\xF7" does not map to Unicode at adddat.pl line 55, <$datfile> line 39.
shiftjis "\xF6" does not map to Unicode at adddat.pl line 55, <$datfile> line 39.
shiftjis "\x87" does not map to Unicode at adddat.pl line 55, <$datfile> line 45.
shiftjis "\x87" does not map to Unicode at adddat.pl line 55, <$datfile> line 45.
shiftjis "\x87" does not map to Unicode at adddat.pl line 55, <$datfile> line 45.
shiftjis "\x87" does not map to Unicode at adddat.pl line 55, <$datfile> line 45.

F6とか87で始まるこの文字何・・・?

と思って調べてみると・・・Windowsの拡張文字・・・!お前か!

①みたいな囲み文字とか、㍍みたいな組み文字たちですね。(ちなみにUnicodeでは国際規格で定義されているのでちゃんと表示されるはず)

Windowsの文字コードは拡張文字を含むので厳密にはShift-JISではありません。
MS932と呼ばれるそうです。
きっとPerlでもこの名前で使えるはず!

open my $datfile, "<:encoding(MS932)", "000000000.dat";
while(my $line=<$datfile>) {
    print $dat;
}

いくつか警告はでるけど、だいぶ少なくなったからよしとしましょう。