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