プロが教えるわが家の防犯対策術!

お世話になります。
下記のスクリプトを使ってrssファイル内をuse Data::Dumper;でダンプして表示してみたのですが、rssファイルがutf8で記述されているせいか
表示時に日本語の所が\x{30fc}のような文字列になってしまいます。
これをshiftjisで表示させたいのですが、試行錯誤してもうまくいきません。
どなたかご教授いただけませんでしょうか。

#!/usr/bin/perl

BEGIN{
$| = 1;
print "Content-type: text/html\n\n";
open(STDERR, ">&STDOUT");
}

use XML::RSS;
use Data::Dumper;
my $rss = new XML::RSS;
#表示形式の違いで1と2がある。
$Data::Dumper::Indent = 1;
use open IN => ":utf8"; # 入力をUTF8とする
use open OUT => ":shiftjis";
#use open ":std";
#use Encode;
#use encoding 'shiftjis', STDIN=>'utf8', STDOUT=>'sjis';
#binmode STDOUT, ":encoding(utf-8)";
#binmode STDOUT, ":encoding(shiftjis)";
#binmode STDOUT, ":encoding(euc-jp)";
#use open ":encoding(shiftjis)";

# rssをセット。
open my $fh, '< ./test.rss';
my $text = join undef, <$fh>;
close $fh;

# rssをパース
$rss->parse($text);

# ひとまず中見を知る為にダンプしてみる
print "Content-type:text/html;charset=Shift_JIS\n\n";
print "<html><head>\n";
print "<title></title></head>\n";
print "<body>\n";
print Data::Dumper->Dump([$rss]);

A 回答 (2件)

#1さんと同じですが


use encoding 'utf-8', STDOUT => 'Shift_JIS';
を始めにつける

$out_text = Data::Dumper->Dump([$rss]);
$out_text =~ s/\\x{([0-9a-f]{4})}/chr(hex($1))/eg;
print $out_text;
だけでいいと思います。
    • good
    • 0
この回答へのお礼

この度はご教授頂き有難うございます。
何とか解決できました。有難うございました。

お礼日時:2006/04/23 04:33

こんにちわ。


Data::Dumperのソースを読むと、utfフラグが立った文字はUseqqを有効にした場合と同様に扱うコードが入ってしまっているためです。(出力時の面倒を避けるためだと思いますが、イマイチの実装ですね・・・。)

次の関数を作ってみたので、お試しください。ただし、ダブルクオート内のutf8記述に見える文字列を全て強引に解答しますので、副作用はあるかもしれません。

use utf8;
use Encode;
use Data::Dumper;

sub expand_utf8($){
my $code = shift;
return Encode::encode('Shift_JIS', chr(hex($code)));
}

sub DumperToSJIS($){
my $ref = shift;
my $str = Dumper($ref);
$str =~ s/??x{([0-9a-fA-F]+)}/expand_utf8($1)/ge;
return $str;
}

#こんな感じでDumper関数と同様に使えます。
print DumperToSJIS({'てすと' => '真珠'});


こっちの環境がMacなので、¥マークが?に化けるかもしれません。その辺りは、申し訳ないですが読み取ってください。

# もっとエレガントな解法あるかもしれません。
    • good
    • 0
この回答へのお礼

この度は参考スクリプトまでご掲示頂きありがとうございます。
まだ私の理解度が乏しく、自分のイメージしている事と関連づけるのに
少し試行錯誤しそうです。
ぜひ今後の参考にさせて頂きたいと思います。
有難うございました。

お礼日時:2006/04/23 04:27

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