【发布时间】: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 次。确实,文件有问题。字符集被定义为 而不是
-
我很高兴这有效!不要用您的答案编辑问题,而是将其回滚并将其作为答案发布并接受。