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);

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

2017-11-09
PCでプッシュ通知ってのをしたい。
2017-11-06
PHPのバージョンを上げたらwikiが壊れたっぽい。
2017-08-03
formのinputでmaxlengthを使うとFirefoxでバグってた。他のブラウザでも気づかずにバグってたかもしれない。
2017-07-19
折れ線グラフをもう少しゆるやかに・・・というか何というか・・・調べていくと「移動平均」っていう言葉にたどり着いた
2017-07-10
FuelPHPの1.8をダウンロードして使っていたらセッションが使えないということに気付いた。