HTML 实体解码指南:把 & 还原成人能读的字
接口返回 &quot;、邮件里满是 '、模板变量显示成 <br>,这些都是实体没有还原。解码本身很快,难的是判断「该不该在这一层还原」。
这些实体是怎么来的
最常见的来源是双重转义:内容先被转义一次存进数据库,输出时又被转义一次,页面上就出现了 &lt;。另一个来源是邮件和 RSS,它们对 HTML 的处理规则更保守,经常保留实体形式。
爬取或复制接口数据时也会遇到:JSON 里的字符串保留了 ",直接读很费劲。还原成引号之后,才好判断它是一段 JSON、一段 HTML,还是普通文字。
- 排查双重转义导致的 &lt;
- 阅读邮件、RSS 和接口里的转义文本
- 复制网页源码后恢复可读形式
解码只做一层
工具按 HTML 规则解析一次:& 变 &、< 变 <、' 和 ' 都变单引号、 变不换行空格。如果原文是 &lt;,结果会是 < 而不是 <,因为那本来就是两层转义,需要再解一次。
解码结果只作为文本显示,不会被执行。也就是说,还原出来的 <script> 不会运行,这让人误以为可以随便把结果贴回页面。实际上,一旦你把它插入 innerHTML,它就会变成真标签。
- 一次只解一层,双重转义要点两次
- 会变成不换行空格,粘进代码容易出怪字符
- 结果仅作为文本显示,不执行脚本
边界:还原之后要重新判断
解码不是消毒。把实体还原成尖括号之后,这段文本就重新具备了 HTML 语法含义;如果它来自用户输入,插回页面前必须再次按上下文转义,否则等于亲手打开注入口,这一步经常被忘掉。
它也不处理 JavaScript 的 \uXXXX、URL 的 %E4、JSON 的 \" 这些转义,各是各的规则。遇到 😀 这类十六进制数字实体可以正常还原,但超出基本平面的字符在部分老环境里仍可能显示异常。
- 解码不是消毒,插回页面前要重新转义
- 不处理 \uXXXX、%XX、JSON 转义
- 数字实体可用,但老环境对 emoji 支持不一
常见问题
为什么 &lt; 只还原了一半?
因为它是两层转义:& 先还原成 &,剩下的 lt; 就只是普通文字。再解一次才会得到尖括号。出现这种情况通常说明某处重复转义了,值得回头查流程。
解码后能直接放进网页吗?
不能直接放。解码得到的是原始字符,其中可能包含 < > 等有语法含义的符号。放回页面前要按输出位置重新转义,否则会把文字变成标签。
解出来是什么?
是不换行空格(U+00A0),看起来和普通空格一样,但不会被浏览器折叠,也不会在换行处断开。粘进代码或配置文件时,它常导致「看起来一样却不相等」的问题。
相关工具:HTML 实体解码