使用 DOMXpath 后的编码问题

Problem with encoding after using DOMXpath

我通过网络抓取(使用 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

刚刚发生了什么?

已解决

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

<meta charset=UTF-8>

没有

<meta charset="UTF-8">

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

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

谢谢@ChrisHaas!