simplexml_load_fileを使う際の文字コード

久々に php のネタを。

今回引っかかったのは「simplexml_load_file」。

simplexml_load_file は php.ini で「allow_url_fopen」が on になっていないと使えないので、まずそこに注意。

あとは Facebook なんかがそうなんですが、ファイルに対してブラウザからは OK だけどサーバーなどからのアクセスは拒否してる場合があります。

その場合は「ini_set(‘user_agent’, ‘ブラウザ情報’);」でユーザーエージェントを偽ってください。(ブラウザ情報って書かれてるところにお好きなブラウザのユーザーエージェント突っ込んでください)

今回はそれもクリアした状態。

なのに取得してきた xml を simplexml_load_file で変換できない。

原因は文字コードでした。

XML 宣言で下記のように文字コードが EUC-JP にされていました。

<![CDATA[<?xml version="1.0" encoding="EUC-JP">]]>

しかし、simplexml_load_file は EUC-JP に対応していない。

なので、文字コードを UTF-8 に変換してあげます。

下記がサンプルソースコード。

str = file_get_contents('http://example.jp/rss.xml');
$xml = str_replace('encoding="EUC-JP">', 'encoding="UTF-8">', mb_convert_encoding($str, 'UTF-8', 'auto'));
$rss = simplexml_load_string($xml, 'simpleXMLElement', LIBXML_NOCDATA);

まずは file_get_contents でソースを取得し mb_convert_encoding でソースを UTF-8 に変換。

str_replace で宣言部分を UTF-8 での宣言に置換。

以上で対応完了。

文字コードの違いだけだとエラーが出ず、画面が真っ白になるだけなので何がいけないのか全くわからないので苦戦しました。

コメントを残す