機種依存文字の文字コード変換
Windowsのメモ帳で保存したテキストファイルの中に「①」があって、それをPerlで読み込んで以下のようにUTF-8に変換したら化けていた。
use Encode; open my $fh, '<', './memo.txt' or die; binmode $fh, q{:encoding(:sjis)}; print encode('utf8' => $_) for (<$fh>); close $fh;
shiftjis "\x87" does not map to Unicode at - line 4. shiftjis "\x87" does not map to Unicode at - line 4. \x87@春はあけぼの \x87A夏はよる ...
そういえばWindowsがいうShift-JISって、Microsoftが拡張したShift-JISなんだっけ、と思い出しつつ、変換コードを Code Point 932 に置き換えたらうまくいった。
use Encode; open my $fh, '<', './memo.txt' or die; #binmode $fh, q{:encoding(:sjis)}; binmode $fh, q{:encoding(:cp932)}; print encode('utf8' => $_) for (<$fh>); close $fh;
①春はあけぼの ②夏はよる ...
参考:
binmode - perldoc.perl.orgPerlIO::encoding - perldoc.perl.org