AmebaブログをRSS取得したときの文字化け対策
先日、とあるウェブサイトのAmebaブログの記事の新着情報をRSSで取得したところ、日本語が使用されているタイトルだけ文字化けしてしまった。
結論から言うと、
「simplexml_load_file」
が原因でした。
おそらく、XMLファイルが一般的でない?
一度、「file_get_contents」でXMLファイルを読み込み、「simplexml_load_string」でオブジェクトデータに変換することで、他のコードは変えずに済みました。
$file = file_get_contents("http://feedblog.ameba.jp/rss/ameblo/ブログID/rss20.xml");
$rssdata = simplexml_load_string($file);
最初は、文字コードを疑って「mb_convert_encoding」でUTF-8/SJIS/EUC-JP全て試すもダメ。
色々試した結果、「simplexml_load_file」に辿り着きました。
「Access-Control-Allow-Origin」エラーが発生する場合
ちなみに、Amebaブログの記事を外部ウェブサイトに埋め込もうとすると、「Access-Control-Allow-Originエラー」が表示されます。
数年前は普通に動いてたコードなのに・・・
どうやら、クロスドメイン系のセキュリティが厳しくなったもよう。
JavaScriptだけではRSSが取得できなくなったので、PHPを介す必要があります。
PHP
<?php
// RSSfeedのURL設定(RSSへのURL)
$file = file_get_contents("http://feedblog.ameba.jp/rss/ameblo/ブログID/rss20.xml");
$rssdata = simplexml_load_string($file);
//var_dump($rssdata);
// 読込み最大MAX件数
$num_of_data = 3;
// 出力内容を空に初期化
$outdata = "";
// 設定した読込み件数分だけ取得を繰り返す
$i = 0;
while($i < $num_of_data){
//記事1個取得
$myEntry = $rssdata->channel->item[$i];
//タイトル取得
$myTitle = $myEntry->title;
if(substr($myTitle,0,3) !="PR:"){
// 日付取得し通常タイプに変換
$myDate = $myEntry->pubDate;
$myDate = strtotime($myDate);
$myDate = date('Y年m月d日',$myDate);
// リンクURL取得
$myLink = $myEntry->link;
// タイトルが空ならストップ
if($myTitle == ""){
break;
}
$outdata .= "<div>\n";
// 出力内容に日付けを挿入
$outdata .= "<dt>" . $myDate . "</dt>\n";
// 出力内容にリンク付きタイトルを挿入
$outdata .= "<dd><a href=" . $myLink . ">" . $myTitle . "</a></dd>\n";
$outdata .= "</div>\n";
}
// タイトル頭が「PR:」ならMAX件数増加
if(substr($myTitle,0,3) =="PR:"){
$num_of_data++;
}
$i++;
}
//すべてを出力する
echo "<dl>" . $outdata . "</dl>";
?>
HTML(heaer内)
<script type="text/javascript">
;(function($){
$(function(){
$.get('rss/rss.php',function(data){
$('#feed').html(data);
})
})
})(jQuery);
</script>
HTML(body内)
<div id="feed"></div>