悦省yueser.com

← 全部指南

HTML 实体解码指南:把 & 还原成人能读的字

接口返回 "、邮件里满是 '、模板变量显示成 <br>,这些都是实体没有还原。解码本身很快,难的是判断「该不该在这一层还原」。

打开工具:HTML 实体解码

这些实体是怎么来的

最常见的来源是双重转义:内容先被转义一次存进数据库,输出时又被转义一次,页面上就出现了 <。另一个来源是邮件和 RSS,它们对 HTML 的处理规则更保守,经常保留实体形式。

爬取或复制接口数据时也会遇到:JSON 里的字符串保留了 ",直接读很费劲。还原成引号之后,才好判断它是一段 JSON、一段 HTML,还是普通文字。

解码只做一层

工具按 HTML 规则解析一次:&amp; 变 &、&lt; 变 <、&#39; 和 &#x27; 都变单引号、&nbsp; 变不换行空格。如果原文是 &amp;lt;,结果会是 &lt; 而不是 <,因为那本来就是两层转义,需要再解一次。

解码结果只作为文本显示,不会被执行。也就是说,还原出来的 <script> 不会运行,这让人误以为可以随便把结果贴回页面。实际上,一旦你把它插入 innerHTML,它就会变成真标签。

边界:还原之后要重新判断

解码不是消毒。把实体还原成尖括号之后,这段文本就重新具备了 HTML 语法含义;如果它来自用户输入,插回页面前必须再次按上下文转义,否则等于亲手打开注入口,这一步经常被忘掉。

它也不处理 JavaScript 的 \uXXXX、URL 的 %E4、JSON 的 \" 这些转义,各是各的规则。遇到 &#x1F600; 这类十六进制数字实体可以正常还原,但超出基本平面的字符在部分老环境里仍可能显示异常。

常见问题

为什么 &amp;lt; 只还原了一半?

因为它是两层转义:&amp; 先还原成 &,剩下的 lt; 就只是普通文字。再解一次才会得到尖括号。出现这种情况通常说明某处重复转义了,值得回头查流程。

解码后能直接放进网页吗?

不能直接放。解码得到的是原始字符,其中可能包含 < > 等有语法含义的符号。放回页面前要按输出位置重新转义,否则会把文字变成标签。

&nbsp; 解出来是什么?

是不换行空格(U+00A0),看起来和普通空格一样,但不会被浏览器折叠,也不会在换行处断开。粘进代码或配置文件时,它常导致「看起来一样却不相等」的问题。

相关工具:HTML 实体解码