Perl日記

日々の知ったことのメモなどです。Perlは最近やってないです。

機種依存文字の文字コード変換

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