WindowsでUTF-8のPerlスクリプトを実行する場合。。。
お世話になります。
2006年に発行された「まるごとPerl」というムックの「まるごとEncode」という記事を見て Perl の日本語処理の勉強をしています。
本記事は Perl5.8 対象と思われますが私は Strawberry Perl 5.10.0 を Windows XP SP3 で使っています。
#! perl
# list1 -- 日本語の文字を1文字として解釈(UTF-8で保存)
use strict;
use warnings;
use utf8;
my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 3, 4);
というサンプルコードがあって、実行結果は「カタカナ」になると書いてあります。
要するに substr 関数が use utf8; によってバイト単位ではなくて文字単位で効くようになるので、4文字目から4文字が正しく取ってこられるという実験ですが、Windows の DOS 窓で実験すると、当然端末コードは Shift_JIS というか CP932 ですので、
Wide character in print at C:\Marugoto\list1.pl line 8.
繧ォ繧ソ繧ォ繝
となります。
そこで、上のコードに binmode 関数を足して、
#! perl
# list1 -- 日本語の文字を1文字として解釈(UTF-8で保存)
use strict;
use warnings;
use utf8;
binmode STDOUT, ':encoding(cp932)'; # 追加
my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 3, 4);
とすると正しく動作しました。
次に、
#! perl
# list2 -- 1オクテットを1文字として解釈(UTF-8で保存)
use strict;
use warnings;
my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 9, 12);
というリストがあって、今度は use utf8; がないのでバイトモードで使う(substr 関数は 9 バイト目から 12 バイトを取ってくる。UTF-8 は全角日本語文字が1文字3バイトなので)という実験ですが、これもそのまま DOS 窓で実行すると
繧ォ繧ソ繧ォ繝
となるので、さっきと同じように binmode 関数を使って、
#! perl
# list2 -- 1オクテットを1文字として解釈(UTF-8で保存)
use strict;
use warnings;
binmode STDOUT, ':encoding(cp932)'; # 追加
my $text = '漢字、カタカナ、ひらがなの混じったtext';
print substr($text, 9, 12);
と書いたのですが、
・\x{0082}" does not map to cp932.
"\x{0082}" does not map to cp932.
"\x{00bf}" does not map to cp932.
"\x{0082}" does not map to cp932.
"\x{0083}" does not map to cp932.
"\x{008a}" does not map to cp932.
a\x{0082}≪a\x{0082}\x{00bf}a\x{0082}≪a\x{0083}\x{008a}
のようになりました。
もちろん、プログラムを Shift_JIS で保存して substr($text, 6, 8) とすれば正しく実行できますが、プログラムを UTF-8 で保存しつつ、Windows で正しく表示する方法はあるでしょうか。
よろしくお願いいたします。