• 締切済み

XML::RSS文字コード統一の仕方がわかりません

perl初心者です。 rssを取得して簡易ブログパーツをつくりたいのですが文字コードでうまいこといかず悪戦しています。 以下がコードです。(きたなくてすいません…) #!/usr/bin/perl use LWP::Simple; use XML::RSS; use utf8; use open ":utf8"; $logfile="./syoukai.log"; open(DAT, "$logfile"); @log=<DAT>; close(DAT); my $rss = new XML::RSS; @list = (); foreach(@log){ ($nom,$name,$prof,$xml,$btitle,$ktitle,$klink)=split(/<>/); eval { $rss->parse( LWP::Simple::get($xml) ); }; if($@) { next; } $btitle = $rss->{'channel'}->{'title'}; $prof = $rss->{'channel'}->{'link'}; $item = $rss->{'items'}; $line = @{$item}[0]; $ktitle = $line->{'title'}; $klink = $line->{'link'}; $date = $line->{'pubDate'}; push(@list, "$date<>$name<>$prof<>$xml<>$btitle<>$ktitle<>$klink<>\n"); } open(IN,">$logfile"); print IN @list; close(IN); exit; syoukai.logを呼び出して そこに書かれたxmlを順番に読み込んで ファイルを更新したいのですが これだと何もいじっていない$nameは大丈夫なんですが $btitleや$ktitleが文字化けしてファイルに書かれてしまいます…。 use utf8;ではなく use encoding 'UTF-8', STDOUT => 'cp932';としたら 今度は$nameだけ文字化けしてしまいます。 別々の文字コードを一緒にしてしまってるからだと思うのですが どれがどの文字コードなのかがわからないでいます。 文字コードを統一する方法などがあれば教えてくださいm(__)m 説明&記述ヘタですいません…。 宜しくお願いします。

みんなの回答

回答No.1

一旦、フラグ付き utf8 にして、ファイルなどに出力するときエンコードを変換します。 表示がくずれるので、空白2文字を全角空白1文字にしていることに注意 #!/usr/bin/perl use strict; use warnings; use autodie; use HTTP::Request; use LWP; use XML::RSS; use constant OUTPUT_FILE => 'foo.log'; my @url_list = qw(   http://weather.livedoor.com/forecast/rss/earthquake.xml   http://weather.livedoor.com/forecast/rss/tsunami.xml); my $rss = XML::RSS->new( encoding => 'UTF-8' ); my $ua = LWP::UserAgent->new; $ua->agent('Mozilla'); $ua->timeout(10); open my $fh, '>', OUTPUT_FILE; binmode $fh, ":encoding(CP932)"; for my $url (@url_list) {   my $req = HTTP::Request->new( GET => $url );   my $res = $ua->request($req);   if ( $res->is_success ) {     $rss->parse( $res->content ) or die "$url";     my $title   = convert_flagged_utf8( $rss->{'channel'}->{'title'} );     my $link    = convert_flagged_utf8( $rss->{'channel'}->{'link'} );     my $item0   = $rss->{'items'}->[0];     my $item_title = convert_flagged_utf8( $item0->{'title'} );     my $item_link = convert_flagged_utf8( $item0->{'link'} );     my $date    = convert_flagged_utf8( $item0->{'pubDate'} );     print {$fh}       "$date<>hoge<>$link<>$url<>$title<>$item_title<>$item_link<>\n";   }   else {     print $res->error_as_HTML, "\n";   } } close $fh; sub convert_flagged_utf8 {   my $str = shift;   my $flagged_utf8     = Encode::is_utf8($str) ? $str : Encode::decode_utf8($str);   return $flagged_utf8; }

hasegawamugen
質問者

お礼

ありがとうございます。 すこしづつ理解してきました。 なんとか思うようにいきそうです! 大変助かりましたm(__)m 教えていただいたスクリプトを参考にもう少し勉強していこうと思います。

関連するQ&A

専門家に質問してみよう