php ShiftJisをUTF-8に変換(Simple HTML DOM Parser)

2011/03/07

Simple HTML DOM Parserでalt属性の中を取得するときに値が変なことになってた。
途中省略するけど下記のような感じで記述をしてた。

  1. define("CHAR_SET","UTF-8");
  2. mb_language("Japanese");
  3.  
  4. // valueには、$Htm->find('div')的な感じでいれてた。
  5. $str = htmlspecialchars( $value->innertext );
  6. $str = mb_convert_encoding($str, CHAR_SET, "auto");

何が変って上手く説明できないんだけど、下記のような感じのソースから取得しようとしたんだ。alt属性の値をね。

  1. <img alt="本a">
  2. サンプル
  3. 図"
  4. サンプル2

上記のようなソースを読み込ませたら下記のような結果になっちゃった。

//予定していた結果
altの値:本a

//実際の結果
altの値:本a">サンプル図"

HTMLソースはShiftJis。PHP側はUTF8。「本a」は「本0」でも同じ結果になる。
「本」と「半角英数字」の組み合わせがダメっぽい。

原因は文字化けだろうとアタリをつけて調べて見るとShiftJisの「本a」をそのままUTF8で読み込むと「{a」って感じになる。
「{」の前にも何かあるけどは文字化けで読めない。
※途中でecho()で出力した。

さらに「図」は「}」ってなってた。
「{」のあとに「半角英数字」がきたら「}」までを一つのくくりとしてみるっぽいね。

人に「こういうものなの?」って聞いたら…回答だけ教えてもらった。

最初は下記のような感じでやってたんだけどstr_get_html()の前でmb_convert_encoding()が必要って。

  1. $lDat = file_get_contents( $_FILES['userfile']['tmp_name'] );
  2.  
  3. $Htm = str_get_html($lDat);

つまり下記のようにする。

  1. $lDat = file_get_contents( $_FILES['userfile']['tmp_name'] );
  2.  
  3. $lDat = mb_convert_encoding($lDat, CHAR_SET, "auto");
  4. $Htm = str_get_html($lDat);

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい