※ ChatGPTを利用し、要約された質問です(原文:DOMDocumentの文字化けに悩まされています)
DOMDocumentの文字化けに悩む|cURLを使ったエンコードに悩む
このQ&Aのポイント
質問者は、cURLを使用してHTMLを取得する際に文字化けの問題に直面しています。
質問者は既に`mb_convert_encoding`を使用してエンコードを変換しようとしましたが、うまくいきませんでした。
質問者は、Shift-JISで書かれたページでも文字化けしてしまうことに困っています。
DOMDocumentの文字化けに悩まされています
cURLを使った場合のエンコードに悩まされています。
$http = new SimplecURL($url); /*cURLを使って指定ページのhtmlを取得する自己関数*/
$html = $http->execute();
$html = mb_convert_encoding($html, "UTF-8", "auto");
この後、取得したHTMLを、
$doc = new DOMDocument();
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
//body部から該当するUrlを抽出
$extracts = $xpath->query($xPath);
foreach ($extracts as $value)
{
$results = trim($value->nodeValue);
$results[] = $result;
}
のようにして取得しているのですが、日本語が文字化けする場合が非常に多いです。
$html = mb_convert_encoding($html, "UTF-8", "auto");
とか、
$result = mb_convert_encoding($result, 'UTF-8', 'auto');
とかするのですがダメです。
色々なサイトでそうなのですが、例えばShift-JISで書かれていると思われる
http://www.nhk.or.jp/worldwave/abc/popup/abc120528.html
などでも日本語を
//div[@class=\"paragraph clearfix\"]//p[@class=\"ja\"]/text()
のようなxPathで取得すると文字化けして出てきます。
mb_convert_encoding($html, "UTF-8", "Shift-JIS")のようにしてもダメです。
どのようにすれば解決するのでしょうか?
アドバイスを頂けないでしょうか?
お礼
ご返答ありがとうございます。 >提示されたサイトをfile_get_contentsで読んでmb_convert_encodingした限りでは問題なくutf-8に置換されました。 そうですか・・・。 自分の場合何が悪いのでしょうか。 cURLで取ってきた後にどこでエンコードを変更すればいいのでしょうか? 自分の今までの経験上、 $extracts = $xpath->query($branchURL_xPath); よりも前でエンコードを変更するとエラーが出ました。 なので、 $result = trim($value->nodeValue); の部分でエンコード変更するしかないと思っていたのですが、どうにも上手くいきません。 >提示されているのは実際に動いているソースではありませんよね? 申し訳ございませんでした。 そうです。 query()の部分の引数は後から変更して入れたものです、間違いです。 $resultsのところもおかしいですね・・・。
補足
ちなみにmb_detect_order()の結果は array 0 => string 'ASCII' (length=5) 1 => string 'JIS' (length=3) 2 => string 'UTF-8' (length=5) 3 => string 'EUC-JP' (length=6) 4 => string 'SJIS' (length=4) となりました。