みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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 で正しく表示する方法はあるでしょうか。

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

投稿日時 - 2009-09-28 16:29:28

QNo.5325882

すぐに回答ほしいです

質問者が選んだベストアンサー

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

投稿日時 - 2009-09-28 17:48:19

お礼

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

投稿日時 - 2009-09-28 20:55:47

ANo.2

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

参考URLをご参照ください

参考URL:http://blog.kumacchi.com/2009/01/utf-8.html

投稿日時 - 2009-09-28 16:45:12

お礼

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

投稿日時 - 2009-09-28 21:00:59

あなたにオススメの質問