三种写法与用途
HTML 实体引用有三种形式:命名实体(以名字引用,如 ©)、十进制数字实体(©)与十六进制数字实体(©)。它们的用途分两类:一是转义语法字符,让用户内容里的 & 与尖括号不被解析成标记或属性边界;二是表示键盘不便输入的符号。解析时以 & 开头、以分号结束,现代写法必须带分号;遇到无法识别的实体名,HTML5 规定按字面文本处理而不是报错,这也让「实体写错」常常静默通过。
基本信息
| 命名形式 | © 表示版权符号 |
|---|---|
| 十进制形式 | © 表示同一字符 |
| 十六进制形式 | © 表示同一字符 |
| 必须转义 | & 与 < 在文本内容中;属性值中还需处理引号 |
| 结束标记 | 以分号结束,现代写法不可省略 |
| 未知实体 | HTML5 按字面文本处理,不报错 |
典型使用场景
- 输出用户内容:把用户输入的尖括号与 & 转义后再放入页面
- 模板渲染:模板引擎默认自动转义,明确场景下需要手动控制
- 邮件与富文本:邮件客户端对实体支持不一,需要选择保守写法
- XML 与 SVG:只支持少量内置命名实体,其余需数字形式
- 调试显示:需要在页面上原样展示 HTML 代码时用实体转义
写法与转义示例
写法与转义示例
# Python 标准库的转义与反转义
python -c "import html; print(html.escape('<a href=\"x\">&</a>'))" # <a href="x">&</a>
python -c "import html; print(html.unescape('<p>1 & 2</p>'))" # <p>1 & 2</p>
# 三种形式等价
python -c "import html; print(html.unescape('©'), html.unescape('©'), html.unescape('©'))"
# 非断行空格是单独字符,不是普通空格
python -c "import html; print(repr(html.unescape(' ')), ord(html.unescape(' ')))" # '\xa0' 160常用实体对照
| 字符 | 命名实体 | 数字实体 |
|---|---|---|
| & | & | & |
| < | < | < |
| > | > | > |
| " | " | " |
| ' | '(HTML5 起支持) | ' |
| 非断行空格 | |   |
| 版权符号 | © | © |
实体在页面中是「先解析后展示」:浏览器把 &lt; 解析为文本 < 并显示出来,而不是显示尖括号。若要显示「<」本身,正确写法是 <;写 &lt; 会显示出 < 这四个字符,这是双重转义的典型表现。
转义不是可选装饰而是安全边界:把未转义的用户内容插入页面,等于允许其注入标签与脚本。任何输出到 HTML 的内容都必须经过与上下文匹配的转义,属性值还必须用引号包裹。
是不可断行空格(U+00A0),与普通空格(U+0020)不同:用它做排版会让字符串比较、搜索与正则匹配失效,也影响换行行为。仅在确实需要禁止断行时使用。