为什么 DOMDocument 在加载 HTML 时无法正确处理 UTF-8 字符?

Mary-Kate Olsen
发布: 2024-11-04 10:12:30
原创
337 人浏览过

Why does DOMDocument fail to handle UTF-8 characters correctly when loading HTML?

DOMDocument 无法处理 UTF-8 字符

在 Web 服务器使用 UTF-8 编码传输响应的情况下,所有文件同样以 UTF-8 保存,并且所有相关设置都已配置为 UTF-8 编码,则会出现问题。旨在验证输出功能的测试程序表现出不规则行为。

执行程序后,输出呈现如下:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>Test!</title></head><body>
    <h1>☆ Hello ☆ World ☆</h1>    
</body></html>
登录后复制

,呈现为:

< ;h1>☆ 你好 ↑ 世界 ↑


节目:

<code class="php">$html = <<<HTML
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Test!</title>
</head>
<body>
    <h1>☆ Hello ☆ World ☆</h1>
</body>
</html>
HTML;

$dom = new DOMDocument("1.0", "utf-8");
$dom->loadHTML($html);

header("Content-Type: text/html; charset=utf-8");
echo($dom->saveHTML());</code>
登录后复制

原因

根本原因是 DOMDocument::loadHTML() 预期 HTML 格式的字符串。 HTML 本质上使用 ISO-8859-1(ISO 拉丁字母表 1)作为其默认字符编码。因此,当为 HTML 4.0 设计的 HTML 解析器遇到超过此编码的字符时,它可能会表现出不可预测的行为。

解决方案

将非 ASCII 字符转换为实体

要纠正此问题,所有 ASCII 范围 (127 / h7F) 之外的字符都应转换为 HTML 实体。此过程可以使用 mb_convert_encoding 和 HTML-ENTITIES 目标编码来实现:

<code class="php">$html = mb_convert_encoding($html, "HTML-ENTITIES", "UTF-8");</code>
登录后复制

添加内容类型元标记

或者,可以通过以下方式解决该问题合并一个标记到文档本身,将字符集指定为 UTF-8:

<code class="html"><meta http-equiv="content-type" content="text/html; charset=utf-8"></code>
登录后复制

此方法充当 DOMDocument 的提示,强制其将输入解释为 UTF-8 编码。即使位于

之外,部分,HTML 2.0 规范规定此类元素将在标头内自动重新定位。

以上是为什么 DOMDocument 在加载 HTML 时无法正确处理 UTF-8 字符?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!