DOMDocument::loadHTML()需要一个HTML字符串。
HTML使用ISO-8859-1编码(ISO拉丁字母第1号)作为默认值。这是因为更长,见6.1. The HTML Document Character Set.实际上,这是更多的默认支持Windows-1252在常见的Web浏览器。
我回去远远,因为PHP的DOMDocument是基于libxml和带来的HTMLparser是专为HTML 4.0。
我想说,这是可以假设,那么你可以加载一个ISO-8859-1编码字符串。
您的字符串是UTF-8编码的。将所有高于127 / h7F的字符转成HTML Entities,你就好了。如果你不想这样做,那就是使用HTML-ENTITIES目标编码的mb_convert_encoding:
>那些具有命名实体的字符,将获得命名实体。 € – > & euro;
>其他人获得他们的数字(十进制)实体,例如。 ☆ – > ☆
下面是一个代码示例,通过使用回调函数使进度更加明显:
$html = preg_replace_callback('/[\x{80}-\x{10FFFF}]/u', function($match) {
list($utf8) = $match;
$entity = mb_convert_encoding($utf8, 'HTML-ENTITIES', 'UTF-8');
printf("%s -> %s\n", $utf8, $entity);
return $entity;
}, $html);
您的字符串的示例输出:
☆ -> ☆
☆ -> ☆
☆ -> ☆
无论如何,这只是为了更深入你的字符串。你想把它转换成一个编码加载HTML可以处理。这可以通过将所有US-ASCII外部转换为HTML实体来完成:
$us_ascii = mb_convert_encoding($utf_8, 'HTML-ENTITIES', 'UTF-8');
注意,你的输入实际上是UTF-8编码。如果你甚至混合编码(这可能发生与一些输入)mb_convert_encoding只能处理每个字符串一个编码。我已经在上面概述了如何更具体地做字符串替换与正则表达式的帮助,所以我现在离开更多的细节。
另一种方法是提示编码。这可以在您的情况下通过修改文档并添加
这是一个指定字符集的Content-Type。这也是对通过网络服务器不可用的HTML字符串的最佳实践(例如,保存在磁盘上或在像您的示例中的字符串)。 Web服务器通常将其设置为响应标头。
如果你不在乎错误的警告,你可以只是添加它在字符串前面:
$dom = new DomDocument();
$dom->loadHTML(''.$html);
根据HTML 2.0规范,只能显示在< head>部分的文件,会自动放置在那里。这也是这里发生的。输出(漂亮打印):
Test!