質問: Perl utf8モジュールの効果と文字化けについて Perl言語を活用しまして、外部サイトのRSSファイルを取得し、その取得したRSSの内容を当方のサイトに出力したいと思っております。 RSSを取得するモジュールとして「XML::FeedPP」というモジュールを活用します。() 今回の質問はutf8モジュールを使用したときに特定の条件で文字化けがおきる理由が知りたいということです。 以下に、RSSファイルを取得しサイトに出力する4つのケースを記述します。(すべてUTF8コード) ケース1、 ケース2、 ケース3、 ケース4、 さて、途中の13行目から「#ケース1~4)」の部分を変更して複数の条件でプログラムを走らせます。 上記の4つのケースのうち、「ケース3」のみ文字化けしてしまいます。 しかし、なぜ「ケース3」だけこのような文字化け現象がおきるのでしょうか? この現象の理由を知りたく存じます。
回答: 外部のページを参照するのは面倒なので、まずは1つにまとめさせてもらいました ``` #!/usr/bin/perl use utf8; use strict; use XML::FeedPP; print "Content-type: text/html\n\n"; print "test\n"; my $source = 'http://www.nicovideo.jp/ranking/fav/daily/g_popular?rss=2.0'; my $feed = XML::FeedPP->new( $source ); print "Title: ", $feed->title(), "\n"; foreach my $item ( $feed->get_item() ) { #ケース1 print "Title: ", $item->title(), ""; #ケース1 #ケース2 my $stock = $item->title(); print "Title: $stock"; #ケース2 #ケース3 my $stock = $item->title(); print "タイトル: $stock"; #ケース3 #ケース4 my $stock = $item->title(); utf8::decode($stock); print "タイトル: $stock"; #ケース4 } print "\n"; exit; ``` さて、本題への答えですが、外部から読み込んだものは、 そのキャラクタセットなどには一切関知せず、 「そのままの形」で保持されていることが原因となっています 対処例から述べますと、use open IN などで、 「外部から読み込んだものはutf-8として取り扱う」といった、 フラグを立てるようにするなどします ケース1および2では、 Titleという半角英数字との組み合わせであるために、特に問題は発生せず、 ケース4においては、 単独でフラグを立ててやってますので、これまた問題は発生せず、 問題のケース3では、 日本語との組み合わせになっているため、 そのままの形でつかってくれれば良いものを・・・ 気を利かせて(というのは言葉のアヤですが)変換しようとしてしまうようなのです 参考