電子書籍の厳選無料作品が豊富!

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/abc1205 …
などでも日本語を
//div[@class=\"paragraph clearfix\"]//p[@class=\"ja\"]/text()
のようなxPathで取得すると文字化けして出てきます。
mb_convert_encoding($html, "UTF-8", "Shift-JIS")のようにしてもダメです。

どのようにすれば解決するのでしょうか?
アドバイスを頂けないでしょうか?

A 回答 (1件)

mb_convert_encodingの第3引数(from encoding)を"auto"にした場合、検出順序はmb_detect_order()の設定に依存します。

今現在のmb_detect_order()がどうなっているか確認してください。

>mb_convert_encoding($html, "UTF-8", "Shift-JIS")のようにしてもダメです。

提示されたサイトをfile_get_contentsで読んでmb_convert_encodingした限りでは問題なくutf-8に置換されました。



そこから先はちょっとわかりません。というか

$extracts = $xpath->query($xPath);

変数名もtypoがありますし、提示されているのは実際に動いているソースではありませんよね?queryの引数が$xPathだし・・・

この回答への補足

ちなみに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)
となりました。

補足日時:2012/05/30 21:48
    • good
    • 0
この回答へのお礼

ご返答ありがとうございます。

>提示されたサイトをfile_get_contentsで読んでmb_convert_encodingした限りでは問題なくutf-8に置換されました。

そうですか・・・。
自分の場合何が悪いのでしょうか。
cURLで取ってきた後にどこでエンコードを変更すればいいのでしょうか?

自分の今までの経験上、
$extracts = $xpath->query($branchURL_xPath);
よりも前でエンコードを変更するとエラーが出ました。
なので、
$result = trim($value->nodeValue);
の部分でエンコード変更するしかないと思っていたのですが、どうにも上手くいきません。




>提示されているのは実際に動いているソースではありませんよね?

申し訳ございませんでした。
そうです。
query()の部分の引数は後から変更して入れたものです、間違いです。
$resultsのところもおかしいですね・・・。

お礼日時:2012/05/30 21:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!