MagpieRSSでチルダがオーバーラインに字化けする場合の対応


この記事は2011年1月に掲載されたものです。
状況が変わったり、リンク先が変わっている可能性があります。

私が運営している別サイトでは、RSSフィードをサイト内に表示させるのにMagpieRSSを使用している。このたび、FeedBurnerでRSSを提供しているサイトをを表示しようとしたとき、相手の文字コードがShift_JISでこちらがUTF-8の場合、URLに含まれるチルダ(˜)がオーバーライン(‾)に字化けすることに気づいた。「HWPS!」によると、これはShift_JISの文字コードマッピングの問題とのこと。

最近URLにチルダを使うところは少なくなったが、FeedBurnerではチルダが2か所入る。「%7E」にURLエンコードしておいてくれれば問題ないのだが、「˜」のままになっているので、Shift_JISからUTF-8に文字コードが変わると化けるのだ。

これだと当然リンク切れになるわけで、RSSフィードを表示させるわけにはいかない。リンク元に飛ばない見出し表示では意味がなく、MagpieRSS側でなんとかする必要がある。複数のサイトから収集したRSSフィードを同じMagpieRSSで処理しているので、rss_fetch.incをいじるわけにはいかず、当該URLだけをstr_replace関数で置換することにした。

<?php
mb_language( 'Japanese' );
require_once 'rss_fetch.inc';
$url   = 'http://feeds.feedburner.jp/********';
$rss   = fetch_rss($url);
$title = $rss->channel['title'];
$title = mb_convert_encoding($title, "UTF-8", "auto");
$url   = $rss->channel['link'];
echo "<h2><a href=\"$url\" target=\"_blank\">$title</a></h2>\n";
echo "<ul>\n";
$rss->items = array_slice($rss->items, 0, 10);
foreach ($rss->items as $item ) {
$title = $item[title];
$title = mb_convert_encoding($title, "UTF-8", "auto");
$url   = $item[link];
$url   = str_replace("‾", "~", $url);  //この行を追加
echo "<li><a href=\"$url\" target=\"_blank\">$title</a></li>\n";
}
echo "</ul>\n";
?>

これで正しくリンクされるようになった。URLにオーバーラインを使うことはあり得ないので、この行は汎用的に入れておいても特に問題ないのではないだろうか。

UTF-8での字化けについては、全角チルダ(~)と波ダッシュ(〜)の問題が有名だが、チルダとオーバーラインについては言及が少なかったので記録しておきたい。⇒Wikipedia「波ダッシュ」Unicodeに関連する問題