php ShiftJisをUTF-8に変換(Simple HTML DOM Parser)
2011/03/07
Simple HTML DOM Parserでalt属性の中を取得するときに値が変なことになってた。
途中省略するけど下記のような感じで記述をしてた。
- define("CHAR_SET","UTF-8");
- mb_language("Japanese");
- // valueには、$Htm->find('div')的な感じでいれてた。
- $str = htmlspecialchars( $value->innertext );
- $str = mb_convert_encoding($str, CHAR_SET, "auto");
何が変って上手く説明できないんだけど、下記のような感じのソースから取得しようとしたんだ。alt属性の値をね。
- <img alt="本a">
- サンプル
- 図"
- サンプル2
上記のようなソースを読み込ませたら下記のような結果になっちゃった。
//予定していた結果
altの値:本a
altの値:本a
//実際の結果
altの値:本a">サンプル図"
HTMLソースはShiftJis。PHP側はUTF8。「本a」は「本0」でも同じ結果になる。
「本」と「半角英数字」の組み合わせがダメっぽい。
原因は文字化けだろうとアタリをつけて調べて見るとShiftJisの「本a」をそのままUTF8で読み込むと「{a」って感じになる。
「{」の前にも何かあるけどは文字化けで読めない。
※途中でecho()で出力した。
さらに「図」は「}」ってなってた。
「{」のあとに「半角英数字」がきたら「}」までを一つのくくりとしてみるっぽいね。
人に「こういうものなの?」って聞いたら…回答だけ教えてもらった。
最初は下記のような感じでやってたんだけどstr_get_html()の前でmb_convert_encoding()が必要って。
- $lDat = file_get_contents( $_FILES['userfile']['tmp_name'] );
- $Htm = str_get_html($lDat);
つまり下記のようにする。
- $lDat = file_get_contents( $_FILES['userfile']['tmp_name'] );
- $lDat = mb_convert_encoding($lDat, CHAR_SET, "auto");
- $Htm = str_get_html($lDat);