binmode関数を2回繰り返すと結果が狂う?
お世話になります。
「まるごとPerl」という雑誌の記事をWindowsに移植してEncodeモジュールの勉強中です。
#! perl
# list1 -- 日本語の文字を1文字として解釈
use strict;
use warnings;
use utf8; # スクリプトは UTF-8 で保存
binmode STDOUT, ':encoding(cp932)'; # 出力はCP932に変更
#4文字目のカから4文字、カタカナと表示される
my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 3, 4);
というスクリプトをUTF-8で保存してWindowsのDOS窓で(コードページはデフォルトのCP932のままで)実行すると
C:\> list1.pl
カタカナ
と無事表示されます。
ところが、うっかり間違えて binmode を
binmode STDOUT, ':encoding(cp932)'; # 出力はCP932に変更
binmode STDOUT, ':encoding(cp932)'; # 出力はCP932に変更
と2回書いてしまうと、結果がこうなります。
C:\> list1.pl
"\x{00ca}" does not map to cp932.
"\x{00de}" does not map to cp932.
"\x{00ca}" does not map to cp932.
"\x{00e9}" does not map to cp932.
\x{00ca}\x{00de}\x{00ca}\x{00e9}
これはいったい何が起こっているのでしょうか。
binmode はあるファイルハンドルのエンコードを決めるもので、何回やっても結果が一緒なのかと思っていました・・・。
00ca、00de、00ca、00deというのも、CP932の「カタカナ」のダンプ「834A 835E 834A 8369」をどうすれば得られるのか不明です・・・。
よろしくお願いします!!!
お礼
まぁいいってことよ。