HTML 实体转换
免费在线 HTML 实体双向转换:编码可选范围与具名或数值风格,解码照 HTML 规范的两千余条具名实体处理,对浏览器会静默替换的坏码点直接报错,全部在浏览器内完成。
等待输入
使用步骤
- 把文本或带实体的 HTML 片段粘贴进输入框
- 选择方向:把文本转成实体,还是把实体还原成文本
- 编码时按需选输出风格(具名、十六进制、十进制)与转换范围(只转危险字符、连非 ASCII 一起转、全部转)
- 点击结果框右上角的复制按钮取走结果
工具说明
HTML 实体是在标记里安全写出「有特殊含义的字符」的办法。& 开始一个实体、< 开始一个标签、> 结束它、引号界定属性值,这五个字符直接写会被当成语法而不是内容,所以要写成 & < > " ' 这样的具名形式,或者 & 与 & 这样的数值形式。这个工具两头都做:把要贴进 HTML 的文字转成实体,以及把抓下来的 HTML、邮件源码里的实体读回人话。
编码这一侧给三个范围和三种风格。范围决定动谁:默认只动上面那五个危险字符,中文原样留着;第二个范围连非 ASCII 一起转,用来把内容塞进不支持 UTF-8 的老系统;第三个把每个字符都转,产出全是实体的紧凑串。风格决定怎么写:具名、十六进制数值、十进制数值。★ 具名档只对那五个字符生效,其余一律走数值 —— 因为「两千多条具名实体的反向表」不是人手抄的东西,而你要做 ASCII 化的时候本来要的就是 中 这种数值形式。
解码这一侧照的是 HTML 规范和浏览器的实际行为,几处反直觉但必须一致的地方:数值实体 0x80 到 0x9F 那一段被规范规定映射到别的字符,所以 € 解出来是 € 而不是控制字符;& 少了分号也照样解,这是为了兼容老页面留在规范里的历史规则,也正因如此 AT&T 这种裸 & 不会被当成拼错的实体(本工具不拦它)。这条链路上的判定都做过外部核对:与 Python 的标准库逐条比对两千余条全称具名实体零差异,另有一批形状(&#x;、�、代理区、超出上限)拿 Chrome 的实际解析结果对过。
有一类坏输入本工具选择报错而不是照解:NUL、代理区(D800 到 DFFF)、超出 Unicode 上限 10FFFF、以及只写了 &#x 一个数字都没有的情况。浏览器遇到这些会静默换成 U+FFFD 画个方块,因为它必须给出点东西;而工具可以把话说明白 —— 拿一个方块回去的人常常以为自己拿的是原字符。★ 边界也说清楚:放进 HTML 用实体,放进 URL 用百分号编码,放进 JS 或 JSON 源码用 \uXXXX,无损携带任意字节用 Base64,只想看字节本身用十六进制工具。这五种都是「把不能直接放的东西换个写法」,但换法互不通用,拿错工具不会报错,只会得到一个看着合理的错答案。所有转换都在你自己的浏览器里完成,输入不会离开这台机器。
常见问题
- 为什么我粘进去的中文没有被转成实体?
- 因为默认范围只动那五个有语法含义的字符。中文在 HTML 里本来就是安全的(只要页面声明了正确的字符集),把它转成实体对显示没有任何好处,反而让源码没法读。要产出纯 ASCII 的内容 —— 通常是为了塞进某个不支持 UTF-8 的老系统或老邮件网关 —— 请把范围换成「连非 ASCII 一起转」,那时 中 会变成 中。
- & 少了结尾的分号,算不算写错?
- 按严格语法算,但规范为了兼容历史明确保留了一批「不写分号也认」的实体,浏览器照此解析,本工具也照此解析:& 解成 &,  解成不换行空格。这个规则的实用含义有两条:读来的 HTML 里少了分号不代表是坏数据;反过来,一段普通文本里的裸 &(AT&T、Q&A、100%&more)不会被判成错误实体,因为规范说那不算实体引用的开头。真正会被拦下的是带分号却拼错的名字,比如 &nosuch; —— 那种一看就是「本想写个实体」。
- 为什么 € 解出来是 € 而不是 U+0080?
- 这是规范里的 C1 替换表:数值实体落在 0x80 到 0x9F 这一段时,不映射到那个码点,而是映射到另一批字符 —— 128 给 €(U+20AC),150 给 –(U+2013),151 给 —(U+2014)。它是上世纪末为兼容一批错误编码的老页面写进规定的,Chrome、Python 标准库和本工具三方实测结果一致。含义有一点遗憾:想通过实体拿到真正的 U+0080 控制字符是办不到的,这段在 HTML 里已经不可达。
- � 在浏览器里能显示,为什么这里要报错?
- 浏览器不是把它解成了字符,而是换成了 U+FFFD(替换字符)画个方块给你看 —— 它不能拒绝渲染,只能给个东西。D800 到 DFFF 是 UTF-16 的代理区,那里住的只是字符的一半,单独一个拼不出任何完整字符,最常见的来源就是 emoji 被从中间截断粘了一半过来。要正确表示笑脸请写完整码点 😀。本工具在这类输入上直接说明原因,因为「解出一个方块」和「解出原字符」在页面上看着一样,而拿到方块的人往往以为自己拿到的是原字符。
- 具名实体和数值实体该用哪个?
- 那五个常用的(& < > " ')用具名,读起来清楚。除此之外数值更稳妥:具名形式并非到处都被认得 —— 比如 ' 是 HTML5 才收进规范的,更早的 HTML4 解析器和一些 XML 工具链看到它会当成非法实体直接报错,而 ' 到哪都能解。要跨系统、跨语言、或者把结果塞进不是自己控制的模板里时,用数值档。本工具的「具名」档也是这个取向:只有那五个出具名,其余一律数值。