電子書籍の厳選無料作品が豊富!

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




説明&記述ヘタですいません…。
宜しくお願いします。

A 回答 (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/earthqu …
  http://weather.livedoor.com/forecast/rss/tsunami …

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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/02/06 13:40

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