- ベストアンサー
Data::Dumper;でダンプ後表示した文字列\x{30fc}...
お世話になります。 下記のスクリプトを使って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]);
- みんなの回答 (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; だけでいいと思います。
その他の回答 (1)
- 11th_style
- ベストアンサー率50% (45/90)
こんにちわ。 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なので、¥マークが?に化けるかもしれません。その辺りは、申し訳ないですが読み取ってください。 # もっとエレガントな解法あるかもしれません。
お礼
この度は参考スクリプトまでご掲示頂きありがとうございます。 まだ私の理解度が乏しく、自分のイメージしている事と関連づけるのに 少し試行錯誤しそうです。 ぜひ今後の参考にさせて頂きたいと思います。 有難うございました。
お礼
この度はご教授頂き有難うございます。 何とか解決できました。有難うございました。