October 25, 2003

BlogRolling OPML に実体参照を使っているときのデコード

[ Perl , XML ]

BlogRolling は英語圏のサービスなので、リンクを登録するときにタイトルに日本語を使うと文字化けしてしまいます。これに対する対処方法として、実体参照に変換して登録する方法が有名です。

movabletype JapanBlog in Xrea 'blogrollingの日本語タイトル文字化け対策'
http://otsune.s9.xrea.com/mt/archives/000017.html

BlogRolling からは自分が登録したサイトの一覧を RSS や OPML で取得できますが、上記の方法で実体参照で登録していると、そのまま実体参照で返って来てしまいます。半角カナ実体参照生成では実体参照を十進で出力するので Perl なら、

$str = s/&#(\d+);/chr($1)/eg;

とかしてデコードしてやれば良いでしょう。

HAIL 2 U !! - Weblog - BlogRolling checker が面白そうだったので動かしてみたのですが、日本語がそのまま実体参照で返ってきてしまったので、ちょっと手を加えました。

[naoya@mary blogrolling]$ diff -u blogrolling.pl.org blogrolling.pl.new | nkf -e
--- blogrolling.pl.org  Sat Oct 25 22:31:09 2003
+++ blogrolling.pl.new  Sat Oct 25 22:33:27 2003
@@ -4,6 +4,7 @@
 
 use HTTP::Date;
 use LWP::Simple;
+use Encode;
 
 # ディレクトリ区切り文字まで
 my $dir = "E:\\Documents\\BlogRolling\\";
@@ -41,6 +42,10 @@
 
 sub escape_name {
        my $str = $_[0];
+
+       $str =~ s/&/&/g;
+       $str =~ s/&#(\d+);/chr($1)/eg;
+       $str = encode("Shift_JIS", $str);
 
        $str =~ s!\\!¥!g;
        $str =~ s!/!/!g;

BlogRolling checker では OPML からアトリビュートを正規表現メモリでぶっこぬいているので、& がそのまま出てきてしまいます。それを & に置換、その後 10 進の実体参照をデコードして、Encode モジュールで Shift_JIS にして完了。

これで日本語のサイトもちゃんと表示されました。

blogrolling_checker.png

ということで、BlogRolling OPML 絡みの話があった Blog Developer's CookbookHAIL 2 U !! にトラックバックしておく。こういうときトラックバックは結構便利。

Posted by naoya at October 25, 2003 10:47 PM | トラックバック (1)  b_entry.gif
トラックバック [1件]
TrackBack URL: http://mt.bloghackers.net/mt/suck-tbspams.cgi/565
BlogRolling checkerその後
Excerpt: 前のエントリーで日本語が実体参照になっててめんどいとか言ってたんですが、NDO::Weblog: BlogRolling OPML に実体参照を使っているときのデコードでスンナリ解決。タイムリーすぎだぁ。ありがとうございます。 それでこんな感じにタスクバーの端っこに隠れるようにして...
Weblog: UnknownPlace.
Tracked: October 26, 2003 07:55 AM
コメント [2件]

私はBlogrollingのサイト追加のページに日本語タイトルを記入するとき、
そのフォームのページをブラウザの設定でエンコード変更(UTF-8に)してから日本語を入力しています。
自分のweblogはUTF-8にしているので、このようにしたら文字化けしませんでした。
他のキャラクターセットのときは動作を確認していません。

[1] Posted by: yy3eee at October 25, 2003 11:38 PM [返信]

>>1 yy3eee さん

あ、なるほど、その手があるんですね。情報ありがとうございます。

でも出力される文字コードをそこで左右しちゃうのは場合によってはまずいかもですね。うちは EUC だったりしますし。

[2] Posted by: naoya at October 26, 2003 03:45 AM [返信]