mabots' blog

知のレバレッジを最大化せよ (旧はてなダイアリーから移転しました。)

SimpleXML simplexml_load_string()で文字コードが原因でエラーになる件

XMLをObjectベースで取り扱えるSimple XMLですが、parseしようしとしたときに、 Cannot use string offset as an array でfatal errorになっていいて、どうもsimplexml_load_string()の時点で、Wariningになってしまうような現象がなかなか解決できませんでした。

そもそもSimpleXMLではUTF-8を前提とした挙動なので、

  • 変な文字コードをヘッダに書いたXML
  • ヘッダではUTF-8などを指定しているにもかかわらずどこかのエレメントに変な文字コードがはいっている

場合に、エラーになってしまう可能性がある。

解決方法としては下記のいづれか。下にいけばいくほど無理やり。

  1. もし、parseさせるXMLをつくっているのであれば、UTF-8のヘッダ付で中身を念のためmb_convert_encodingしてXMLつくる
  2. 外部サイトのXMLファイル(RSSとか)の場合は、中身をmb_convert_encoding($hoge,mb_detect_encoding($hoge)) などする。
    • ただし、mb_detect_encodingは完璧な挙動をするわけではないので注意。
    • 本当はUTF-8なのにヘッダは違う文字コードを宣言している場合は正規表現などでヘッダを置換してしまうのもありか・・(なんか本末転倒ですが)
  3. 最後の手段として、UTF-8 -> SJISにして、SJIS->UTF-8にさらに戻すことでとりあえずなんとかする。ただし文字情報の一部が棄損する恐れがある。


結局最後の手段で対応。最近文字コードとの戦いが多いなぁw