piapia123
zh

HTML 实体编码与解码

编码加密

所有处理都在浏览器本地完成,数据不上传服务器

输入
输出

把 < > & " 和单引号转成实体,或者反过来把实体还原成字符。编码只动这 5 个 —— 它们是 HTML 里真正有语法含义的字符:决定标签从哪开始、属性值到哪结束。其余字符写成字面量完全合法,一并编掉只会让输出没法阅读、diff 没法对比。解码认得命名实体(收录了网页里最常见的 200 多条)、十进制 &#20013; 与十六进制 &#x4E2D; 两种数字实体,而且只解一遍:&amp;lt; 会还原成 &lt; 而不会一路解成 < —— 反复解码正是 XSS 的经典产生方式。不认识的实体会原样保留,不报错也不抹掉。

功能

  • 双向转换:文本 ⇄ HTML 实体
  • 编码只转义 < > & " 与单引号这 5 个有语法含义的字符,其余保持原样
  • 可选把非 ASCII 字符编成数字实体:中文 → &#20013;&#25991;,emoji → &#128512;
  • 解码支持命名实体(nbsp、copy、mdash、箭头、数学符号、希腊字母等 200 多条)
  • 解码支持 &#20013; 十进制与 &#x4E2D; 十六进制两种数字实体
  • 只解码一遍:&amp;lt; 得到 &lt; 而不是 <
  • 不认识的实体与越界的码点原样保留,不报错也不吞掉

使用方法

  1. 选择方向:编码或解码
  2. 需要连中文一起编成数字实体时,勾上「编码非 ASCII 字符」
  3. 把内容粘贴进输入框,结果实时出现
  4. 点「复制」取走结果

常见问题

为什么只转义 5 个字符?
因为在 HTML 里只有 < > & " 和单引号有语法含义:它们决定标签从哪儿开始、属性值到哪儿结束、实体从哪儿起头。其余字符(包括中文与 emoji)直接写成字面量都是合法的,全编成实体只会让代码无法阅读。需要整段 ASCII 化的场景,勾上「编码非 ASCII 字符」。
单引号为什么编成 &#39; 而不是 &apos;?
&apos; 是 XML 与 HTML5 才加入的实体,老解析器不认。数字实体 &#39; 在任何解析器里都等价于单引号,兼容性更稳。
为什么 &amp;lt; 解出来是 &lt;,而不是一个尖括号?
本工具只解码一遍,这是安全上正确的做法。反复解码会让 &amp;lt;script&amp;gt; 这类输入穿过只过滤一次的防御,是 XSS 最经典的产生方式。需要嵌套解码时请显式再解一次,并清楚自己在做什么。
为什么有的实体没被解出来?
本工具收录的是网页里最常见的 200 多条,没有收录 HTML5 完整的 2200 多条(那会让页面体积翻十倍)。遇到没收录的 &foo; 会原样保留 —— 你能一眼看到这里有个没被处理的实体,而不是收到一个报错或者被悄悄抹掉。

相关工具