HTML 实体完整参考表
HTML 实体(HTML Entities)用于在网页中显示保留字符与特殊符号。本表覆盖最常用的命名实体及其十进制 / 十六进制数字实体写法,附字符说明。
原理解析
HTML 实体是把「会干扰解析」或「键盘打不出」的字符转写成安全文本的机制。最常见的三类必须转义:<、>、&,否则会被浏览器当作标签或实体边界。
实体分命名实体(©、 )与数字实体(©、• 十六进制)。它既能避免 XSS(把用户输入的 < 转成 <),也能显示版权号、箭头等符号。但实体不等于空格折叠——连续空白仍会被 HTML 合并。
什么时候该查这张表
这张表在你要把特殊字符安全写进 HTML 或从 HTML 里还原原字符时有用。它给出命名实体(&)、十进制与十六进制数值三种等价写法,以及每个字符的用途。生成器、解析器、转义与反转义都离不了它。
不该查的情况:你在做完整的 HTML 清洗或 XSS 防护。实体表只解释「这些字符是什么」,不提供「什么时候该转义哪些字符」的策略——那是净化库(如 DOMPurify)的职责,把实体表当安全清单用会漏掉大量攻击面。
判断标准:看字符在输出位置扮演什么角色。文本节点里 < > & " ’ 需要转义;属性值里还要看引号风格,用双引号包裹时单引号可不转义,反之亦然;URL 参数里 & 与 = 是分隔符,必须编码。
特别注意分号:HTML 实体允许省略结尾分号(& 可解析为 &),但在文本节点内紧跟字母时会产生歧义(&x 会被解析为 &x)。始终写完整分号,兼容性最好。
边界与常见陷阱
实体可以省略分号,紧跟字母时会静默改变语义
HTML5 允许 「&」 不带分号就解析为 &。但若后面紧跟字母或数字,解析器会尝试最长的匹配:「&x」 在某些解析器里变成 「&x」(把 x 吃进实体名),而不是字面的 「&x」。这会造成内容静默丢失,且只在特定上下文触发,极难排查。规范做法:永远写完整 「&」。
实体编码不是 XSS 防护,浏览器会先解码再解析
把 < 写成 < 只在文本节点里有效。如果你把用户输入放进属性、URL 或脚本上下文,浏览器可能在更早阶段解码实体,防护就失效了。例如 <img src=x onerror=alert(1)> 放进未加引号的属性并对尖括号做实体编码,浏览器仍可能解析出事件属性。正确做法是用上下文正确的编码(HTML 文本 / 属性 / JS 字符串 / URL 各有规则),高风险场景直接上 DOMPurify。
双编码会让内容多出一层字面量
对已编码的文本再编码一次,「&」 会变成 「&amp;」,页面显示 「&」 而不是 「&」。常见触发链路是「序列化两次」:模板引擎自动转义 + 手工再 escapeOnce,或者 JSON 放进 HTML 后又过了一遍编码。排查方法:在浏览器里看实际 DOM 文本而不是看源码,源码里的多层 & 往往是正常的。
与相邻内容的分工
要查字符本身长什么样、码点是多少,用站内「ASCII 码」与字符编码页;本页关注的是 HTML 实体这一层封装。
要处理 URL 里的百分号编码(%20、%E4%B8%AD),属于 URL 编码页的范畴,与 HTML 实体是两套机制。
要批量转义或反转义文本,用站内 HTML 相关工具;本页是语义对照表,不提供处理管线。
若目的是防 XSS,本表不足以作为安全依据——需用成熟净化库并配合 CSP,而不是靠人工挑字符转义。
实战片段
要点:① 实体分号不可省,紧跟字母时 HTML5 的最长匹配会把字母吃进实体名,导致内容静默丢失;② 实体编码只在文本节点有效,属性与脚本上下文必须按上下文编码或直接用 DOM API 构造节点,高风险场景上 DOMPurify 并配 CSP;③ 属性值必须始终带引号,无引号属性遇到空格即被逃逸;④ 需要反转义时用 textarea 或 DOM 解析,不要手写正则,容易漏掉嵌套实体。
// ① 三个等价写法(分号都要写全)
const s = '&' // & 字符
'&' // & 命名实体
'&' // & 十进制
'&' // & 十六进制
// ② 用 DOM 构造而非字符串拼接(自动转义,最安全的默认做法)
const el = document.createElement('div')
el.textContent = '<script>alert(1)</script>' // 纯文本,不解析为标签
el.innerHTML = '<script>alert(1)</script>' // ⚠️ 会解析成真的 script
document.body.append(el)
// ③ 必须拼 HTML 时,转义「文本节点」的 5 个字符就够
const ESC = { '&’: ’&’, ’<’: ’<’, ’>’: ’>’, ’"’: ’"’, "’": ’'' }
const esc = s => String(s).replace(/[&<>"']/g, c => ESC[c])
// ④ 属性值:按引号风格决定要不要转义单/双引号
const attrDouble = 'data-x="' + esc(userInput) + '"' // 双引号包裹 ⇒ 单引号已转义
// ⚠️ 无引号属性最危险:空格即可逃逸,必须始终加引号
// <div class=USER> ← USER 含空格就断了
// ⑤ 反转义:优先用 DOM,不自己写正则
const decode = html => {
const d = document.createElement('textarea')
d.innerHTML = html
return d.value
}
console.log(decode('<b>')) // <b> (作为文本,不是标签)
// ⑥ 识别「实体没写分号」的隐患
const risky = '&x' // 某些解析器解析为 &x,内容被吃掉
console.log(risky) // 始终写 '&x' 才对实践注解
- & 这类命名实体有分号,缺了分号浏览器靠猜HTML 解析器在缺失分号时会按「最长可识别实体」回退,于是 & 能显示成 &,但 ¬in 会被解析成 ¬ 加 in。在属性值里遇到 & 后跟字母时,这个回退规则尤其容易制造意外,所以实体一律写全分号。
- 是不换行空格,不是普通空格它的码位是 U+00A0,用普通空格做正则替换(把空格换成下划线之类)会漏掉它;反过来用它排版又会让文本无法在窄屏折行。做数据清洗时应先把 U+00A0 归一成 U+0020。
- 在 <script> 与预格式化文本里不要用实体<script> 是原始文本元素,内容不做实体解码,写 & 会原样进入 JS 字符串导致语法错误;<pre>/<textarea> 内的实体虽会解码,但会把用户的原始输入改形,做代码展示时应直接输出已转义文本。
数据来源
- WHATWG HTML Standard §13.5 (named character references)
上述编号、名称与定义均来自公开规范,本站不主张对规范数据本身的独创性;本页的编排方式、中文释义与实践注解由本站撰写。
| 命名实体 | 十进制 | 十六进制 | 字符 | 说明 |
|---|---|---|---|---|
| & | & | & | & | 和号(&),须转义避免被解析为实体 |
| < | < | < | < | 小于号(<),标签起始符须转义 |
| > | > | > | > | 大于号(>),标签结束符须转义 |
| " | " | " | " | 双引号("),属性值中建议转义 |
| ' | ' | ' | ' | 单引号('),HTML5 支持,XML 不支持 |
| |   |   | 不换行空格(non-breaking space) | |
| © | © | © | © | 版权符号 © |
| ® | ® | ® | ® | 注册商标 ® |
| ™ | ™ | ™ | ™ | 商标符号 ™ |
| … | … | … | … | 省略号 … |
| — | — | — | — | 长破折号 — |
| – | – | – | – | 短破折号 – |
| € | € | € | € | 欧元符号 € |
| £ | £ | £ | £ | 英镑符号 £ |
| ¢ | ¢ | ¢ | ¢ | 美分符号 ¢ |
| ¥ | ¥ | ¥ | ¥ | 日元 / 人民币符号 ¥ |
| × | × | × | × | 乘号 × |
| ÷ | ÷ | ÷ | ÷ | 除号 ÷ |
| ± | ± | ± | ± | 正负号 ± |
| ° | ° | ° | ° | 度符号 ° |
| § | § | § | § | 章节符号 § |
| • | • | • | • | 项目符号 • |
| · | · | · | · | 中间点 · |
| « | « | « | « | 左双尖引号 « |
| » | » | » | » | 右双尖引号 » |
| ² | ² | ² | ² | 平方上标 ² |
| ³ | ³ | ³ | ³ | 立方上标 ³ |
| ½ | ½ | ½ | ½ | 二分之一 ½ |
| ∞ | ∞ | ∞ | ∞ | 无穷符号 ∞ |
| ≠ | ≠ | ≠ | ≠ | 不等于 ≠ |
| ≤ | ≤ | ≤ | ≤ | 小于等于 ≤ |
| ≥ | ≥ | ≥ | ≥ | 大于等于 ≥ |
常见问题
为什么要用 HTML 实体?
在 HTML 中 <、>、&、" 是保留字符,直接写会被解析为标签或实体语法。用实体(如 <)可以安全地显示这些字符本身。
命名实体和数字实体哪个更好?
命名实体(如 ©)可读但依赖规范名称表;数字实体(如 © 或 ©)直接引用 Unicode 码点,兼容性更广,在 XML 中更安全。
所有字符都需要转义吗?
不是。只有保留字符(& < > " ')和建议转义的引号需要在属性值中转义;普通中英文正文无需转义。
HTML5 支持 ' 吗?
HTML5 支持 '(单引号),但 XML/XHTML 1.0 不支持,跨文档时使用数字实体 ' 更稳妥。