読者です 読者をやめる 読者になる 読者になる

文字列を print すると「Wide character in print at」と出力されて困った

以下のプログラム(参考:作って学ぶ、今どきのWebサービス: 第2回 RSSフィードの料理はLWPとXML::RSSにおまかせ)を実行したら、「Wide character in print at」というメッセージが print を実行する度に出力されてしまった。

#!/usr/local/bin/perl
# http://www.ibm.com/developerworks/jp/webservices/library/itm-ws2-rss/
use strict;
use Encode;
use LWP::Simple;
use XML::RSS;

my $url = shift;
my $document = LWP::Simple::get($url)
    or die "cannot get content from $url";

my $rss = XML::RSS->new;
$rss->parse($document);
for (@{$rss->{items}}) {
  print $_->{title}, "\n";
}


ググってみると、どうやら、「UTF-8フラグが付いた文字列をprintしようとしている」ことが問題だったらしい。(UTF-8フラグって何だろう…)
参考:Wide character in print at ...


まず、次の方法でUTF-8フラグが付いているかの確認をしてみると、案の定、付いていた。

UTF8フラグが付いているかの確認
print utf8::is_utf8($string) ? 'flagged' : 'no flag';


解決方法としては、以下の2つのいづれかを使えばOK。

$string を utf-8 に変換
print encode('utf-8', $string);
IO layer を UTF-8 にする
binmode(STDOUT, ":utf8");