HTML实体编码与解码
转义HTML会当作标记处理的字符,也可以选择转义所有非ASCII字符;或者把 é、— 这类实体还原为纯文本。编码和解码都在浏览器中完成,解码后的内容绝不会作为可执行的HTML渲染。
0 个字符 · 0 个词 · 0 行
0 个字符 · 0 个词 · 0 行
完全在当前浏览器标签页中运行,您的文本不会被上传或保存。
常见字符及其实体
命名、十进制和十六进制形式解码后都是同一个字符。编码器支持 216 个常用命名实体;解码器能识别 HTML 标准中的所有命名引用。
| 字符 | 命名 | 十进制 | 十六进制 |
|---|---|---|---|
& | & | & | & |
< | < | < | < |
> | > | > | > |
" | " | " | " |
' | ' | ' | ' |
(不换行空格) | |   |   |
© | © | © | © |
® | ® | ® | ® |
™ | ™ | ™ | ™ |
€ | € | € | € |
£ | £ | £ | £ |
¥ | ¥ | ¥ | ¥ |
— | — | — | — |
– | – | – | – |
… | … | … | … |
« | « | « | « |
» | » | » | » |
° | ° | ° | ° |
× | × | × | × |
÷ | ÷ | ÷ | ÷ |
é | é | é | é |
π | π | π | π |
→ | → | → | → |
😀 | — | 😀 | 😀 |
从HTML 4的252个实体到HTML5的2,231个
字符引用是只用 ASCII 字符来书写任意字符的方式。数字引用适用于任何 Unicode 码位,可以用十进制(é)或十六进制(é)表示。命名引用更容易记忆:HTML 4 定义了 252 个,涵盖 é 等 Latin-1 字母、希腊字母、数学符号,以及 —、… 这类排版符号。有意思的是,' 并不在其中;它来自 XML,直到 HTML5 才成为有效的 HTML。
HTML5 把命名字符引用扩充到 2,231 个,并吸收了 MathML 的实体集,因此 ✓、★、≂̸ 这样的名称现在在所有主流浏览器中都能使用。这个数量包含不带结尾分号的旧式写法,例如 & 和 ©,解析器出于兼容仍会接受,但你不应该这样写。这里的编码器输出兼容性广泛的 HTML 4 名称外加 ',其余字符回退为数字引用;解码器则把文本交给浏览器自带的解析器处理,因此能识别全部 2,231 个名称。
哪些字符需要转义,以及仅靠转义不够的情况
仅 & < > " ' 适合日常使用:它会转义可能结束文本节点或带引号属性的五个字符,足以在页面上展示代码示例,或把用户输入的文本安全地放进 HTML。同时转义所有非 ASCII 字符会把 é、€ 和 emoji 也转成引用,适用于少数无法传输 UTF-8 的场景,例如某些老式邮件模板或会破坏编码的系统。命名、十进制和十六进制只改变引用的写法,三者解码后得到的是同一个字符。以 UTF-8 保存的页面,带重音的字母不需要使用实体。
转义只保护 HTML 上下文,其他场景无效。插入 script 块、onclick 之类的内联事件处理器、style 属性,或可能以 javascript: 开头的 href 中的文本,需要另外的处理方式,仅靠实体编码无法防止这些位置的跨站脚本攻击。React 等框架默认会转义文本,所以在现代应用中更常见的错误是重复转义:用户在本该显示 & 的地方看到了 &。如果想彻底去掉标签,请用 HTML转TXT 转换标记;如需转义 URL 中的内容,请使用 URL编码与解码。
常见问题
- HTML中哪些字符必须转义?
- 在文本中,& 和 < 是必须转义的,> 按惯例也会转义。在属性值内,还要转义用来包围它的引号字符。五个字符全部转义即可覆盖这两种情况。
- 和普通空格有什么区别?
是不换行空格,即 U+00A0。它看起来像空格,但会阻止在该处换行,而且与 HTML 中普通空格不同,连续出现多个时不会被合并。- 为什么页面上显示的是 & 而不是 & 符号?
- 文本被转义了两次:一次在你的数据中,另一次由模板或框架完成。请保存原始文本,只让一层(通常是模板)在输出时负责转义。
- 在这里解码来源不可信的HTML安全吗?
- 可以。解码器把输入当作纯文本内容解析,因此不会生成标签、不会运行脚本,也不会加载图片,只会把实体引用转换成字符。
- 命名实体和数字实体哪个更好?
- 命名引用更易读,数字引用适用于所有字符,并且在所有 XML 解析器中都有效。在没有 DTD 的 XML 中,只有
&、<、>、"和'是预定义的。