PHP DOMDocument saveHTML未正确编码西里尔字母

3
我使用DOMDocument来处理HTML和PHP 7。问题是,页面上的文本(西里尔字母)看起来很好,但当我查看“查看HTML页面源代码”时,它不好。它显示如下:&#1047;&#1076;&#1077;&#1089;&#1100; &#1086;&#1089;&#1085; 可能有什么问题?<meta> charset是utf-8。我的代码:
$dom = new DOMDocument();
if (@$dom->loadHTML(mb_convert_encoding("<div>$body</div>", 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD)) {

    // https://dev59.com/7F0b5IYBdhLWcg3wMutw

    $container = $dom->getElementsByTagName('div')->item(0);
    $container = $container->parentNode->removeChild($container);

    while ($dom->firstChild)
        $dom->removeChild($doc->firstChild);

    while ($container->firstChild )
        $dom->appendChild($container->firstChild);

    $xpath = new DOMXPath($dom); 
    $headlines = $xpath->query("//h2");
    // some code..

    return $dom->saveHTML();
}

请验证您的编码文档页面:https://stackoverflow.com/questions/14927122/how-to-save-russian-characters-in-a-utf-8-encoded-file - Weenesta - Mathieu Dormeval
1个回答

8
问题出现在$dom->saveHTML();上,你需要添加根节点作为参数,像这样:$dom->saveHTML($dom->documentElement);
return $dom->saveHTML((new \DOMXPath($dom))->query('/')->item(0));

突然它会用代替方式重新渲染页面。如果没有,请仔细检查$dom->encoding$dom->substituteEntities的值,它们应该分别为UTF-8TRUE


你是怎么知道的,我的朋友?我阅读了很多资料,没有人写过这个解决方案。 - sirjay
1
从记忆中,我几年前在自己的框架中也遇到了同样的问题。更短的语法是 $dom->saveHTML($dom->documentElement); - Code4R7
@sirjay 其他人也找到了解决方案。在 PHP 官网上并没有对此行为进行说明。谷歌搜索结果中也没有任何信息,因此问题可能出现在 SaveHTML 函数将参数传递给 Libxml 中,我怀疑 PHP 团队并不知道这一点,因为没有关于 SaveHTML 的错误报告。这是用户自己发现的问题。 - Code4R7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接