为什么DOMDocument :: saveHTML()的行为在将UTF-8编码为样式和脚本元素中的实体时会有所不同?

时间:2018-08-02 18:44:14

标签: php dom encoding

给出一个DOMDocument,其样式表包含如下表情符号字符:

$dom = new DOMDocument();
$dom->loadHTML( "<!DOCTYPE html><html><head><meta charset=utf-8><style>span::before{ content: \"⚡️\"; }</style></head><body><span></span></body></html>" );

在将DOM序列化回HTML时,我发现了一些奇怪的行为。

如果我$dom->saveHTML( $dom->documentElement ),那么我会得到(如所期望的那样):

<html><head><meta charset="utf-8">
<style>span::before{ content: "⚡️"; }</style>
</head><body><span></span></body></html>

但是,如果我改为$dom->saveHTML()保存我得到的整个文档(错误):

<html><head><meta charset="utf-8">
<style>span::before{ content: "&#9889;&#65039;"; }</style>
</head><body><span></span></body></html>

请注意,表情符号“⚡️”是如何在样式表中编码为HTML实体&#9889;&#65039;的,浏览器不喜欢这样,并且应将其视为文字字符串,因为CSS转义\26A1应该代替。

我尝试设置$dom->substituteEntities = false,但没有任何效果。

script标记内也发生了相同的HTML实体转换,这在浏览器中引起了类似的问题。

通过在线PHP shell:https://3v4l.org/jMfDd

进行测试

0 个答案:

没有答案