simplexml_import_domで文字化け

最近、スクレイピングでいろいろやってるんだけど、文字化けで困ったのでメモ。

DOMでデータを扱うときで元データがEUCの場合、下の様にHTMLをUTF-8に変換してから処理をしてるんだけど、

$HTML = mb_convert_encoding($HTML,”utf8″, “euc-jp”);
$HTML = preg_replace(‘/charset=euc-jp/’ , ‘charset=utf-8′ , $HTML);
$HtmlDOM = @DOMDocument::loadHTML($HTML);
$HtmlXML = simplexml_import_dom($HtmlDOM);

なぜか、これで必ず文字化けが発生するページが一部あって。どうやら、simplexml_import_domのところで化けてるらしい。

で、調べてみた所、php>DOM>文字化けって記事を書いている方がいらっしゃいました。

ここを参考に

$HTML = mb_convert_encoding($HTML,”utf8″, “euc-jp”);
$HTML = mb_convert_encoding($HTML, ‘HTML-ENTITIES’, “UTF-8″);
$HTML = preg_replace(‘/charset=euc-jp/’ , ‘charset=utf-8′ , $HTML);
$HtmlDOM = @DOMDocument::loadHTML($HTML);
$HtmlXML = simplexml_import_dom($HtmlDOM);

とすると文字化けが解消しました。

原因は mb_convert がらみかな?mb_convert_encodingの項でこんな記載がありました。
http://jp2.php.net/mb_convert_encoding#69412
文字コードって難しいね。