HTML 字符实体参考¶
HTML 字符引用把源码中的一段 ASCII 文本解析为 Unicode 字符。 现代文档应使用 UTF-8;普通中文和大多数符号无需为了兼容性全部写成实体。
三种形式¶
| 形式 | 示例 | 说明 |
|---|---|---|
| 命名引用 | © |
易读,但只有标准定义的名称可用 |
| 十进制数字引用 | © |
直接引用 Unicode 码位的十进制值 |
| 十六进制数字引用 | © |
直接引用 Unicode 码位的十六进制值 |
建议保留结尾分号,避免与后续字母或数字连在一起产生解析歧义。 “HTML 实体”是常用说法,规范更常使用 character reference(字符引用)。
HTML 语法字符¶
| 显示字符 | 命名引用 | 数字引用 | 何时使用 |
|---|---|---|---|
& |
& |
& |
文本中的与号,避免被解析为引用开头 |
< |
< |
< |
文本中的小于号,避免被解析为标签开头 |
> |
> |
> |
显示标签或避免歧义时 |
" |
" |
" |
双引号属性值内需要显示双引号时 |
' |
' |
' |
单引号属性值内需要显示单引号时 |
' 在 HTML5 中有效;' 也常用于兼容旧处理链。
常用空白与标点¶
| 字符 | 命名引用 | 数字引用 | 说明 |
|---|---|---|---|
| NBSP | |
  |
不换行空格,不用于视觉缩进 |
| © | © |
© |
版权 |
| ® | ® |
® |
注册商标 |
| ™ | ™ |
™ |
商标 |
| … | … |
… |
省略号 |
| – | – |
– |
en dash |
| — | — |
— |
em dash |
| “ | “ |
“ |
左双弯引号 |
| ” | ” |
” |
右双弯引号 |
在文本和属性中¶
<p>条件:3 < 5,名称:A & B。</p>
<a href="/search?q=fish&page=2">下一页</a>
<code><strong>重点</strong></code>
HTML 源码中的属性分隔符 & 写作 &;浏览器解析后的 URL 仍包含普通 &。
属性值应加引号,但加引号不代表其中的不可信数据已经安全。
不能解决的问题¶
| 误区 | 正确认识 |
|---|---|
| 实体可以切换文档编码 | 字符编码由字节、HTTP 头和 <meta charset> 决定 |
| 所有非 ASCII 字符都必须实体化 | UTF-8 中可直接书写绝大多数文字和符号 |
| HTML 转义适用于任何上下文 | JavaScript、CSS、URL 和 HTML 属性有不同规则 |
| 先拼接再替换几个字符即可防 XSS | 应使用自动上下文编码和安全 DOM API |
可以排版 |
布局应使用 CSS 的间距、Grid 或 Flexbox |
安全边界¶
- 普通文本进入 DOM 时优先使用
textContent,不要拼接到innerHTML。 - URL 参数使用
URL、URLSearchParams或可靠序列化器,参见URL 编码。 - 不可信值进入事件处理器、
style或脚本块时,HTML 实体不能提供完整保护。 - 数据经过解码、拼接或跨上下文后,应按新的目标上下文重新处理。
- 实体解码不能代替输入验证、认证、授权、CSP 或 Trusted Types。
检查要点¶
- 是否只在必要位置使用字符引用,并统一保留分号?
- 是否避免双重编码,例如把
&再变成&amp;? - 是否区分源码文本、DOM 字符值与网络传输字节?
- 是否把 UTF-8、上下文编码和业务验证分别处理?