domdocument php charset gbk,PHP DomDocument无法处理utf-8字符(☆)

本文探讨了PHP中DOMDocument加载HTML字符串时遇到的编码问题,特别是当输入为UTF-8编码而DOMDocument默认期望ISO-8859-1编码时。文中详细介绍了如何通过不同的方法将UTF-8编码转换为DOMDocument可识别的形式,包括使用mb_convert_encoding函数和直接修改HTML字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

小编典典

DOMDocument::loadHTML()需要一个HTML字符串。

HTML ISO-8859-1根据其规范使用默认的编码(ISO拉丁字母1号)。那是因为更长,请参见 6.1。

HTML文档字符集。实际上,这更是Windows-1252常见的Web浏览器的默认支持。

我之所以回去很远,是因为PHP的DOMDocument基于libxml,并且带来了专为HTML4.0设计的HTMLparser。

我想可以假设您可以加载ISO-8859-1编码的字符串。

您的字符串已UTF-8编码。将所有高于127/h7F的字符转换为HTML实体,就可以了。如果您不想自己做,mb_convert_encoding那么HTML-ENTITIES目标编码就是这样:

那些已命名实体的字符将获得命名实体。 € -> €

其他人得到他们的数字(十进制)实体,例如 ☆ -> ☆

以下是一个代码示例,该示例通过使用回调函数使进度更加明显:

$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);

您的字符串的以下示例输出:

☆ -> ☆

☆ -> ☆

☆ -> ☆

无论如何,那只是为了更深入地研究您的字符串。您希望将其转换为loadHTML可以处理的编码。可以通过将所有外部内容US-

ASCII转换为HTML实体来完成:

$us_ascii = mb_convert_encoding($utf_8, 'HTML-ENTITIES', 'UTF-8');

请注意,您的输入实际上是UTF-8编码的。如果您甚至使用混合编码(某些输入可能发生这种情况),mb_convert_encoding则每个字符串只能处理一种编码。我已经在上面概述了如何在正则表达式的帮助下更具体地进行字符串替换,因此现在我将进一步详细介绍。

另一种选择是 提示 编码。根据您的情况,可以通过修改文档并添加一个

这是指定字符集的Content-

Type。对于无法通过Web服务器获得的HTML字符串(例如,保存在磁盘上或如示例中的字符串中),这也是最佳做法。网络服务器通常将其设置为响应头。

如果您不在乎错误放置的警告,则可以将其添加到字符串的前面:

$dom = new DomDocument();

$dom->loadHTML(''.$html);

根据HTML 2.0规范,仅会出现在

文档部分中的元素将自动放置在此处。这也是这里发生的情况。输出(漂亮打印):Test!

☆ Hello ☆ World ☆

2020-05-26

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值