【问题标题】:Problem with encoding after using DOMXpath使用 DOMXpath 后出现编码问题
【发布时间】:2021-11-13 13:09:51
【问题描述】:

我抓取(使用 curl)一个页面并尝试检索 LD-Json 内容。

所以首先我得到了页面的内容:

  $handle = curl_init();
  curl_setopt($handle, CURLOPT_URL, $url);
  curl_setopt($handle, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($handle, CURLOPT_FOLLOWLOCATION, true);

  $page = curl_exec($handle);
  curl_close($handle);

它工作正常。

我在十六进制编辑器中检查了 $data 内容,发现页面被正确编码为 UTF-8。 例如字符“ół”被编码为“C3 B3 C5 82”,这是可以的。

当我查询 ld-json 脚本时问题就开始了:

  $dom = new DOMDocument();
  @$dom->loadHTML($page);
  $xpath = new DOMXpath($dom);
  $jsonScripts = $xpath->query( '//script[@type="application/ld+json"]' );

然后

      foreach ($jsonScripts as $jScript)
      {
          $json = $jScript->nodeValue;
          $data = json_decode($cleared, true);

突然之间,相同的字符现在被编码为“C3 83 C2 B3 C3 85 C2 82

刚刚发生了什么?

【问题讨论】:

  • 请参阅this,它说 DOMDocument 默认在 ISO-8859-1 中工作,您需要将其启动为 UTF-8 模式。您从中加载此内容的站点可能在 HTTP 标头中而不是在 HTML 中。
  • @ChrisHaas - 谢谢你 100 次。确实,文件有问题。字符集被定义为 而不是
  • 我很高兴这有效!不要用您的答案编辑问题,而是将其回滚并将其作为答案发布并接受。

标签: php utf-8 domxpath


【解决方案1】:

已解决

问题出在抓取的页面上。 字符集定义为

<meta charset=UTF-8>

不是

<meta charset="UTF-8">

解决方法是将代码更改为:

  @$dom->loadHTML('<?xml encoding="utf-8" ?>'.$page);

谢谢@ChrisHaas!

【讨论】:

    最近更新 更多