HTML 实体完整参考表

HTML 实体(HTML Entities)用于在网页中显示保留字符与特殊符号。本表覆盖最常用的命名实体及其十进制 / 十六进制数字实体写法,附字符说明。

原理解析

HTML 实体是把「会干扰解析」或「键盘打不出」的字符转写成安全文本的机制。最常见的三类必须转义:<、>、&,否则会被浏览器当作标签或实体边界。

实体分命名实体(&copy;、&nbsp;)与数字实体(&#169;、&#x2022; 十六进制)。它既能避免 XSS(把用户输入的 < 转成 &lt;),也能显示版权号、箭头等符号。但实体不等于空格折叠——连续空白仍会被 HTML 合并。

什么时候该查这张表

这张表在你要把特殊字符安全写进 HTML 或从 HTML 里还原原字符时有用。它给出命名实体(&amp;)、十进制与十六进制数值三种等价写法,以及每个字符的用途。生成器、解析器、转义与反转义都离不了它。

不该查的情况:你在做完整的 HTML 清洗或 XSS 防护。实体表只解释「这些字符是什么」,不提供「什么时候该转义哪些字符」的策略——那是净化库(如 DOMPurify)的职责,把实体表当安全清单用会漏掉大量攻击面。

判断标准:看字符在输出位置扮演什么角色。文本节点里 < > & " ’ 需要转义;属性值里还要看引号风格,用双引号包裹时单引号可不转义,反之亦然;URL 参数里 & 与 = 是分隔符,必须编码。

特别注意分号:HTML 实体允许省略结尾分号(&amp 可解析为 &),但在文本节点内紧跟字母时会产生歧义(&ampx 会被解析为 &x)。始终写完整分号,兼容性最好。

边界与常见陷阱

  • 实体可以省略分号,紧跟字母时会静默改变语义

    HTML5 允许 「&amp」 不带分号就解析为 &。但若后面紧跟字母或数字,解析器会尝试最长的匹配:「&ampx」 在某些解析器里变成 「&x」(把 x 吃进实体名),而不是字面的 「&amp;x」。这会造成内容静默丢失,且只在特定上下文触发,极难排查。规范做法:永远写完整 「&amp;」。

  • 实体编码不是 XSS 防护,浏览器会先解码再解析

    把 < 写成 &lt; 只在文本节点里有效。如果你把用户输入放进属性、URL 或脚本上下文,浏览器可能在更早阶段解码实体,防护就失效了。例如 <img src=x onerror=alert(1)> 放进未加引号的属性并对尖括号做实体编码,浏览器仍可能解析出事件属性。正确做法是用上下文正确的编码(HTML 文本 / 属性 / JS 字符串 / URL 各有规则),高风险场景直接上 DOMPurify。

  • 双编码会让内容多出一层字面量

    对已编码的文本再编码一次,「&amp;」 会变成 「&amp;amp;」,页面显示 「&amp;」 而不是 「&」。常见触发链路是「序列化两次」:模板引擎自动转义 + 手工再 escapeOnce,或者 JSON 放进 HTML 后又过了一遍编码。排查方法:在浏览器里看实际 DOM 文本而不是看源码,源码里的多层 &amp; 往往是正常的。

与相邻内容的分工

要查字符本身长什么样、码点是多少,用站内「ASCII 码」与字符编码页;本页关注的是 HTML 实体这一层封装。

要处理 URL 里的百分号编码(%20、%E4%B8%AD),属于 URL 编码页的范畴,与 HTML 实体是两套机制。

要批量转义或反转义文本,用站内 HTML 相关工具;本页是语义对照表,不提供处理管线。

若目的是防 XSS,本表不足以作为安全依据——需用成熟净化库并配合 CSP,而不是靠人工挑字符转义。

实战片段

要点:① 实体分号不可省,紧跟字母时 HTML5 的最长匹配会把字母吃进实体名,导致内容静默丢失;② 实体编码只在文本节点有效,属性与脚本上下文必须按上下文编码或直接用 DOM API 构造节点,高风险场景上 DOMPurify 并配 CSP;③ 属性值必须始终带引号,无引号属性遇到空格即被逃逸;④ 需要反转义时用 textarea 或 DOM 解析,不要手写正则,容易漏掉嵌套实体。

// ① 三个等价写法(分号都要写全)
const s = '&'      // &     字符
'&amp;'             // &amp;      命名实体
'&#38;'             // &#38;      十进制
'&#x26;'            // &#x26;     十六进制

// ② 用 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 = { '&’: ’&amp;’, ’<’: ’&lt;’, ’>’: ’&gt;’, ’"’: ’&quot;’, "’": ’&#39;' }
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('&lt;b&gt;'))    // <b>  (作为文本,不是标签)

// ⑥ 识别「实体没写分号」的隐患
const risky = '&ampx'                // 某些解析器解析为 &x,内容被吃掉
console.log(risky)                    // 始终写 '&amp;x' 才对

实践注解

  • &amp; 这类命名实体有分号,缺了分号浏览器靠猜HTML 解析器在缺失分号时会按「最长可识别实体」回退,于是 &amp 能显示成 &,但 &notin 会被解析成 &not 加 in。在属性值里遇到 & 后跟字母时,这个回退规则尤其容易制造意外,所以实体一律写全分号。
  • &nbsp; 是不换行空格,不是普通空格它的码位是 U+00A0,用普通空格做正则替换(把空格换成下划线之类)会漏掉它;反过来用它排版又会让文本无法在窄屏折行。做数据清洗时应先把 U+00A0 归一成 U+0020。
  • 在 <script> 与预格式化文本里不要用实体<script> 是原始文本元素,内容不做实体解码,写 &amp; 会原样进入 JS 字符串导致语法错误;<pre>/<textarea> 内的实体虽会解码,但会把用户的原始输入改形,做代码展示时应直接输出已转义文本。

数据来源

  • WHATWG HTML Standard §13.5 (named character references)

上述编号、名称与定义均来自公开规范,本站不主张对规范数据本身的独创性;本页的编排方式、中文释义与实践注解由本站撰写。

命名实体十进制十六进制字符说明
&amp;&#38;&#x26;&和号(&),须转义避免被解析为实体
&lt;&#60;&#x3C;<小于号(<),标签起始符须转义
&gt;&#62;&#x3E;>大于号(>),标签结束符须转义
&quot;&#34;&#x22;"双引号("),属性值中建议转义
&apos;&#39;&#x27;'单引号('),HTML5 支持,XML 不支持
&nbsp;&#160;&#xA0; 不换行空格(non-breaking space)
&copy;&#169;&#xA9;©版权符号 ©
&reg;&#174;&#xAE;®注册商标 ®
&trade;&#8482;&#x2122;™商标符号 ™
&hellip;&#8230;&#x2026;…省略号 …
&mdash;&#8212;&#x2014;—长破折号 —
&ndash;&#8211;&#x2013;–短破折号 –
&euro;&#8364;&#x20AC;€欧元符号 €
&pound;&#163;&#xA3;£英镑符号 £
&cent;&#162;&#xA2;¢美分符号 ¢
&yen;&#165;&#xA5;¥日元 / 人民币符号 ¥
&times;&#215;&#xD7;×乘号 ×
&divide;&#247;&#xF7;÷除号 ÷
&plusmn;&#177;&#xB1;±正负号 ±
&deg;&#176;&#xB0;°度符号 °
&sect;&#167;&#xA7;§章节符号 §
&bull;&#8226;&#x2022;•项目符号 •
&middot;&#183;&#xB7;·中间点 ·
&laquo;&#171;&#xAB;«左双尖引号 «
&raquo;&#187;&#xBB;»右双尖引号 »
&sup2;&#178;&#xB2;²平方上标 ²
&sup3;&#179;&#xB3;³立方上标 ³
&frac12;&#189;&#xBD;½二分之一 ½
&infin;&#8734;&#x221E;∞无穷符号 ∞
&ne;&#8800;&#x2260;≠不等于 ≠
&le;&#8804;&#x2264;≤小于等于 ≤
&ge;&#8805;&#x2265;≥大于等于 ≥

常见问题

为什么要用 HTML 实体?

在 HTML 中 <、>、&、" 是保留字符,直接写会被解析为标签或实体语法。用实体(如 &lt;)可以安全地显示这些字符本身。

命名实体和数字实体哪个更好?

命名实体(如 &copy;)可读但依赖规范名称表;数字实体(如 &#169; 或 &#xA9;)直接引用 Unicode 码点,兼容性更广,在 XML 中更安全。

所有字符都需要转义吗?

不是。只有保留字符(& < > " ')和建议转义的引号需要在属性值中转义;普通中英文正文无需转义。

HTML5 支持 &apos; 吗?

HTML5 支持 &apos;(单引号),但 XML/XHTML 1.0 不支持,跨文档时使用数字实体 &#39; 更稳妥。