【メモ】 DOMDocument::loadHTMLで文字化けする場合

HTML文書を読み込んでパースするときに、今までは正規表現でやっていたんですが、
処理がどうしても面倒な感じになるし改変にも弱いので、DOMでやることにしてみたらば見事に嵌るなど。
読み込む文書がXMLだと問題ないんですが、HTML、特にShift-JISで書かれた文書だとなぜか文字化け。

色々と検索した結果、多分これで行けると言うのにたどり着いたのでメモ。

参考

DOM拡張モジュールでHTMLをパースする【PHP】 – Programming Magic


文字化けさせないためのポイント

  1. 読み込む文書をUTF-8に変換しておく
  2. あらかじめ日本語文字列を数値文字参照に変換しておく

1. 読み込む文書をUTF-8に変換しておく

PHPのデフォルト文字コードに合わせる、と言う意味です。

2. あらかじめ日本語文字列を数値文字参照に変換しておく

よく解らなかったんですがこれが文字化けの直接できな原因のようです。
参考エントリでは「metaタグで文字エンコードが指定されていない」場合に起きると書かれていますが、
文字エンコードに「Shift_JIS」が指定されていても発生しました。

というわけで、あらかじめ日本語文字列を数値文字参照に変換しておきます。

$html = mb_convert_encoding($html, 'HTML-ENTITIES', 'ASCII, JIS, UTF-8, EUC-JP, SJIS');

これだと、表示上文字化けは起きません。
それどころか、コメント以外の部分は普通に日本語で書き出されているようです。
ので、このままでもいいかなーという感じ。



まぁとはいえ、あんまりDOMについて解っていないので、だいぶ泥縄であれこれやってるんですけどね…
サーバの全面引っ越し(およびドメインの変更)はいつになることやら。