プロが教えるわが家の防犯対策術!

お世話になります。
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 で正しく表示する方法はあるでしょうか。

よろしくお願いいたします。

A 回答 (2件)

表示するときに


print Encode::decode('utf8', substr($text, 9, 12));
とする.
そもそも 12文字表示されているという時点で「UTF-8 と思われていない」ことに気づかなきゃ.
    • good
    • 1
この回答へのお礼

うおー、ありがとうございます!
バッチリわかりました。
またよろしくお願いします。

お礼日時:2009/09/28 20:55

参考URLをご参照ください



参考URL:http://blog.kumacchi.com/2009/01/utf-8.html
    • good
    • 0
この回答へのお礼

ありがとうございます!
そうなんです、これがうまくいくと面倒はないんですけどね。。。
とまれ、どうもありがとうございます。

お礼日時:2009/09/28 21:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!