字符编码和使用 Zend\Dom\Query

Character encoding and using Zend\Dom\Query

我在使用 Zend Framework 2 对波兰语字符进行编码时遇到问题。我使用:

use Zend\Dom\Query;

休息码:

$dom = new Query(); 
$document = '<ul id="test"><li>ęółąśłżźć</li><li>test</li></ul>';
$dom->setDocumentHtml($document);
$dom->setEncoding('utf-8');
$ul = $dom->execute('#test li');
foreach($ul as $li)
{
    echo $li->nodeValue;
}   

结果:

ÄóÅÄÅÅżźÄtest

如何正确显示这些字符?

我尝试使用 PHP 函数 (iconv, utf8_encode) 但没有成功。

经过多次尝试设法解决了这个问题,但我认为这不是一个好的解决方案。

我已将适当的 headers 添加到 HTML 文档中

$document = '<!DOCTYPE html>'. //Add
'<html lang="pl">'. //Add
'<head>'. //Add
    '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />'. //Add
    '<meta http-equiv="content-language" content="pl" />'. //Add
'</head>'. //Add
'<body>'. //Add
    '<ul id="test">'.
        '<li>ęółąśłżźć</li>'.
        '<li>test</li>'.
    '</ul>'.
'</body>'. //Add
'</html>'; //Add

效果不错

在幕后 Zend\Dom\Query 使用 DOMDocument,它建立在 libxml 之上,其 HTML 解析器是为 HTML 制作的 4. 默认编码这是 ISO-8859-1。

Query::setEncoding() 不影响文档的加载方式。


解决方法:

首先使用 mb_convert_encoding 将 ASCII 范围以上的任何内容转换为其 html 等效实体。

$dom->setDocumentHtml(mb_convert_encoding($document, 'HTML-ENTITIES', 'UTF-8'));

或者修改元标记或 xml 指定 UTF-8 的声明。

$dom->setDocumentHtml('<meta http-equiv="Content-Type" content="charset=utf-8" />' . $document);
$dom->setDocumentHtml('<?xml encoding="UTF-8">' . $document);