HTML实体完整指南
HTML实体是Web开发中最基本却又经常被误解的方面之一。它们是浏览器能够显示否则会被解释为HTML标记的字符的机制,并在Web安全中发挥着关键作用。无论你是在编码特殊字符以防止跨站脚本攻击、显示数学符号,还是确保内容在不同编码下正确渲染,理解HTML实体对每个Web开发者来说都是必不可少的。
什么是HTML实体?
HTML实体是代表HTML中单个字符的字符序列。实体以与号(&)开头,以分号(;)结尾。当浏览器遇到实体时,它会在渲染期间将其替换为相应的字符。这种机制允许你在HTML中包含否则不可能或有问题的字符。
<)开始一个标签,大于号(>)结束一个标签,与号(&)开始一个实体引用。如果你想将这些字符显示为可见内容而非标记,你必须将它们编码为实体。
常见HTML实体
虽然HTML定义了超过2,000个命名实体,但少数几个在日常Web开发中被频繁使用。这些是你最常遇到和使用的实体:
五个必需的实体
| 字符 | 命名实体 | 十进制实体 | 十六进制实体 | 用法 |
|---|---|---|---|---|
| & | & | & | 必须始终编码以避免与实体引用的歧义 | < |
| < | < | < | 必须编码以防止打开HTML标签 | > |
| > | > | > | 必须编码以防止关闭HTML标签 | " |
| " | " | " | 在双引号属性值内必须编码 | ' |
| ' | ' | 在单引号属性值内必须编码 | 不间断空格(防止换行) | 版权符号 |
常用符号实体
| 字符 | 命名实体 | 描述 |
|---|---|---|
| 注册商标符号 | 商标符号 | 破折号(长划线) |
| 短划线(用于范围) | 左指向双角引号 | 右指向双角引号 |
| 项目符号字符 | 水平省略号(三个点) | Registered trademark symbol |
| ™ | ™
| Trademark symbol |
| — | —
| Em dash (long dash) |
| – | –
| En dash (short dash, for ranges) |
| « | «
| Left-pointing double angle quotation mark |
| » | »
| Right-pointing double angle quotation mark |
| • | •
| Bullet character |
| … | …
| Horizontal ellipsis (three dots) |
数字实体与命名实体
HTML实体有两种形式:命名和数字。理解差异有助于你在每种情况下选择正确的实体。
命名实体
<代表小于号,©代表版权符号。命名实体更易读和记忆,使你的HTML源代码更易维护。然而,命名实体仅存在于有限的字符集——大约2,000个,而Unicode中有超过140,000个字符。
数字实体
数字实体通过Unicode码位引用字符。它们有两种形式:十进制和十六进制。十进制数字实体使用格式NNN;,其中NNN是十进制码位。十六进制实体使用格式HHH;,其中HHH是十六进制码位。例如,版权符号可以写成©(十进制)或©(十六进制)。
数字实体可以表示任何Unicode字符,使其对于没有命名实体引用的字符至关重要。如果你需要显示罕见的CJK字符、历史文字字形或缺少命名实体的表情符号,你必须使用数字形式。
何时使用哪种
- <、>、"、')和常见符号如©、®、™使用命名实体。它们更易读且自文档化。
- 当你需要的字符没有命名实体时使用数字实体,或者当你以编程方式生成HTML并需要一致的通用编码方法时。
- 在处理Unicode码位时使用十六进制数字实体,因为十六进制是Unicode文档和字符表中的标准表示法。
何时使用HTML实体
知道何时使用实体与知道如何使用同样重要。以下是实体必要或有益的主要场景:
1. 显示保留字符
<。如果你写一个裸的<,浏览器会尝试将其解析为HTML标签的开始,这可能破坏你的页面布局或创建安全漏洞。
2. 防止歧义与号
与号后跟字母和分号总是被解释为实体引用。如果你的内容中有一个不属于实体的与号(例如在"Tom & Jerry"中),你必须将其编码为&。未编码的与号后跟恰好匹配实体名称的文本将被错误解码。例如,未编码的"AT&T"可能变成"AT&T",如果浏览器将&T解释为实体引用(尽管&T不是有效实体,这种行为在技术上仍然是错误的)。
3. 包含非键盘字符
像破折号、版权符号和数学运算符等字符在标准键盘上可能难以输入。实体提供了一种可靠的方式来包含这些字符,而不依赖于编辑器的输入法或字符映射。例如,—通常比在键盘上查找破折号字符更容易输入。
4. 不间断空格
实体创建一个不间断空格,防止浏览器在该位置换行。这对于将相关单词保持同一行至关重要,例如"10 kg"、"第3章"或不应跨行分割的品牌名称。它也常用于在CSS不合适的布局中创建视觉间距。
安全影响:XSS防护
HTML实体编码是防御跨站脚本(XSS)攻击的最重要的防线之一。当攻击者能够在其他用户查看的网页中注入可执行代码时,就会发生XSS。实体编码通过将危险字符转换为其安全的实体等效项来防止这种情况。
实体编码如何防止XSS
而页面未编码渲染,浏览器将执行该脚本。然而,如果输出经过实体编码,它变成<script>alert('xss')</script>,浏览器将其显示为字面文本而非执行代码。
特定上下文的编码规则
实体编码在HTML内容和属性上下文中有效,但不同的上下文需要不同的编码策略:
- <、>、&编码为实体。这防止注入新的HTML标签。
- <、>、&、"、'编码为实体。引号必须编码以防止跳出属性值。