什么是 HTML 转义字符?新手必懂的基础概念与用法
一、HTML 转义字符到底是什么?一句话说透
HTML 转义字符(也称字符实体/HTML实体)是一套用特定编码来表示特殊字符的机制,目的是让浏览器把这些字符当作"普通文本"来显示,而不是当作 HTML 代码来解析。
它的格式固定:以 & 开头,以 ; 结尾,中间是实体名称或数字编码。
举个最直观的例子:
| 你想显示的字符 | 直接写会怎样 | 正确的转义写法 | 浏览器最终显示 |
|---|---|---|---|
< | 浏览器认为是标签开始 | < | < |
> | 浏览器认为是标签结束 | > | > |
& | 浏览器认为是实体开始 | & | & |
" | 可能提前闭合属性值 | " | " |
' | 可能破坏属性结构 | ' | ' |
核心逻辑就一句话:在 HTML 中,<、>、&、"、' 这五个字符拥有"特权",如果你想让它们作为普通文字出现,就必须用转义字符"缴械"。
二、为什么必须转义?两个根本原因
新手最常问的问题是:"我直接打出 < 不行吗?为什么要绕一圈写 <?"
答案是:不转义,轻则页面显示错乱,重则网站被黑客攻击。
1. 防止 HTML 解析错误
HTML 解析器看到 < 就会认为"后面跟着一个标签名",看到 > 就认为"标签到此结束"。如果你在正文里写:
<p>数学公式:5 < 10 且 10 > 5</p>
浏览器会把 < 10 误认为是一个标签的开始,导致后面的内容全部解析混乱,页面直接"花屏"。
正确写法:
<p>数学公式:5 < 10 且 10 > 5</p>
浏览器就会老老实实显示为:5 < 10 且 10 > 5。
2. 防止 XSS 跨站脚本攻击(这是安全底线)
XSS(Cross-Site Scripting)是 Web 开发中最常见、最危险的安全漏洞之一。 攻击者的手段非常简单:在输入框里填一段恶意脚本,如果你没有做转义,这段脚本就会在其他用户的浏览器里直接执行。
经典攻击案例:
<!-- 用户在评论区输入了这段内容 -->
<script>alert('你的Cookie已被窃取');</script>
如果没有转义,浏览器会把它当作真正的 <script> 标签来执行,弹出恶意弹窗,甚至窃取用户 Cookie。
转义之后:
<script>alert('你的Cookie已被窃取')</script>浏览器只会把它当成一段普通文字显示出来,脚本完全失效。
所以,HTML 转义不是"可选项",而是所有 Web 开发者的"必选项"。它是抵御 XSS 攻击的第一道防线。

三、五大核心转义字符(必须死记)
| 字符 | 实体名称 | 数字编码 | 用途说明 | 优先级 |
|---|---|---|---|---|
< | < | < | 小于号,标签开始符 | ⭐⭐⭐⭐⭐ |
> | > | > | 大于号,标签结束符 | ⭐⭐⭐⭐⭐ |
& | & | & | 和号,实体引导符 | ⭐⭐⭐⭐⭐ |
" | " | " | 双引号,属性值定界符 | ⭐⭐⭐⭐ |
' | ' | ' | 单引号,属性值定界符 | ⭐⭐⭐ |
特别强调:& 必须第一个转义。 因为 & 是所有实体的引导符,如果你先转义了 < 和 >,但没转义 &,可能会产生连锁错误。
正确的转义顺序:
先转义 & → 再转义 < 和 > → 最后转义 " 和 '
用代码表示就是:
text = text.replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, ''');
顺序反了会怎样? 比如你先把 < 替换成 <,然后再替换 &,那原本的 < 会被变成 &lt;,结果显示出来就是 < 这串文字,而不是 < 符号。这就是经典的"连锁转义错误"。
四、两种转义格式:命名实体 vs 数字实体
HTML 转义字符有两种写法,效果完全一样:
| 格式类型 | 语法 | 示例 | 特点 |
|---|---|---|---|
| 命名实体 | &名称; | < > & | 好记,直观,推荐日常使用 |
| 数字实体 | &#编号; 或 &#x十六进制; | < < | 所有浏览器都支持,适合不常见字符 |
命名实体的优势:一看就知道是什么字符,< 比 < 好记得多。
数字实体的优势:不依赖命名,任何字符都能用数字表示,不会出现"这个字符没有命名实体"的尴尬。
实际开发中,命名实体够用 99% 的场景。只有处理生僻字符(如某些外语字母、数学符号)时,才需要用数字实体。
五、常用 HTML 转义字符完整对照表
5.1 基础必备(5 个)
| 字符 | 实体名称 | 数字编码 | 说明 |
|---|---|---|---|
| < | < | < | 小于号 |
| > | > | > | 大于号 |
| & | & | & | 和号 |
| " | " | " | 双引号 |
| ' | ' | ' | 单引号(HTML5 新增) |
5.2 空格相关(4 个)
| 字符 | 实体名称 | 数字编码 | 说明 |
|---|---|---|---|
| 不换行空格 | |   | 最常用,强制保留空格不换行 |
| 半方空格 |   |   | 约等于半个汉字宽度 |
| 全方空格 |   |   | 约等于一个汉字宽度 |
| 窄空格 |   |   | 极细的空格 |
为什么需要 ? 因为 HTML 会把连续多个空格合并成一个。如果你想在页面里显示多个连续空格,必须用 。
5.3 版权与商标(4 个)
| 字符 | 实体名称 | 数字编码 | 说明 |
|---|---|---|---|
| © | © | © | 版权符号 |
| ® | ® | ® | 注册商标 |
| ™ | ™ | ™ | 商标(美国) |
| ℗ | ℗ | ℗ | 录音版权 |
5.4 常用数学与特殊符号
| 字符 | 实体名称 | 数字编码 | 说明 |
|---|---|---|---|
| × | × | × | 乘号 |
| ÷ | ÷ | ÷ | 除号 |
| ± | ± | ± | 正负号 |
| ≠ | ≠ | ≠ | 不等于 |
| ≤ | ≤ | ≤ | 小于等于 |
| ≥ | ≥ | ≥ | 大于等于 |
| ° | ° | ° | 度数符号 |
| ² | ² | ² | 上标2 |
| ³ | ³ | ³ | 上标3 |
5.5 ISO Latin-1 字符集精选
| 字符 | 实体名称 | 数字编码 | 字符 | 实体名称 | 数字编码 |
|---|---|---|---|---|---|
| ¡ | ¡ | ¡ | ¢ | ¢ | ¢ |
| £ | £ | £ | ¤ | ¤ | ¤ |
| ¥ | ¥ | ¥ | ¦ | ¦ | ¦ |
| § | § | § | ¨ | ¨ | ¨ |
| ª | ª | ª | « | « | « |
| ¬ | ¬ | ¬ | ® | ® | ® |
| ¯ | ¯ | ¯ | ° | ° | ° |
| ± | ± | ± | ² | ² | ² |
| ³ | ³ | ³ | ´ | ´ | ´ |
| µ | µ | µ | ¶ | ¶ | ¶ |
| · | · | · | ¸ | ¸ | ¸ |
| ¹ | ¹ | ¹ | º | º | º |
| » | » | » | ¼ | ¼ | ¼ |
| ½ | ½ | ½ | ¾ | ¾ | ¾ |
| ¿ | ¿ | ¿ | À | À | À |
| Á | Á | Á | Â | Â | Â |
| Ã | Ã | Ã | Ä | Ä | Ä |
| Å | Å | Å | Æ | Æ | Æ |
| Ç | Ç | Ç | È | È | È |
| É | É | É | Ê | Ê | Ê |
| Ë | Ë | Ë | Ì | Ì | Ì |
| Í | Í | Í | Î | Î | Î |
| Ï | Ï | Ï | Ñ | Ñ | Ñ |
| Ò | Ò | Ò | Ó | Ó | Ó |
| Ô | Ô | Ô | Õ | Õ | Õ |
| Ö | Ö | Ö | × | × | × |
| Ø | Ø | Ø | Ù | Ù | Ù |
| Ú | Ú | Ú | Û | Û | Û |
| Ü | Ü | Ü | Ý | Ý | Ý |
| Þ | Þ | Þ | ß | ß | ß |
| à | à | à | á | á | á |
| â | â | â | ã | ã | ã |
| ä | ä | ä | å | å | å |
| æ | æ | æ | ç | ç | ç |
| è | è | è | é | é | é |
| ê | ê | ê | ë | ë | ë |
| ì | ì | ì | í | í | í |
| î | î | î | ï | ï | ï |
| ð | ð | ð | ñ | ñ | ñ |
| ò | ò | ò | ó | ó | ó |
| ô | ô | ô | õ | õ | õ |
| ö | ö | ö | ÷ | ÷ | ÷ |
| ø | ø | ø | ù | ù | ù |
| ú | ú | ú | û | û | û |
| ü | ü | ü | ý | ý | ý |
| þ | þ | þ | ÿ | ÿ | ÿ |
六、实战:四种常用转义方法
6.1 手动替换(最简单,适合少量文本)
直接用字符串的 replace 方法逐个替换:
function escapeHtml(text) {
return text
.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
}优点:零依赖,逻辑透明,容易理解。
缺点:只能处理已知字符,遇到生僻字符会漏掉。
6.2 利用浏览器 DOM API(最安全,推荐)
浏览器本身就内置了转义能力,利用 innerText 或 textContent 可以自动完成转义:
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}原理:当你把一段文本赋值给 textContent 时,浏览器会自动把所有特殊字符转义为实体。然后读取 innerHTML,拿到的就是转义后的结果。
优点:不会遗漏任何字符,浏览器保证 100% 正确。
缺点:依赖浏览器环境,Node.js 中不能直接用。
6.3 正则表达式批量替换(适合服务端)
const escapeMap = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": '''
};
function escapeHtml(text) {
return text.replace(/[&<>"']/g, char => escapeMap[char]);
}优点:性能好,适合处理大量文本。
缺点:需要手动维护映射表。
6.4 使用 DOMParser(最严谨)
function escapeHtml(text) {
const parser = new DOMParser();
const doc = parser.parseFromString(text, 'text/html');
return doc.documentElement.textContent;
}优点:利用浏览器原生解析器,最严谨。
缺点:性能相对较低,不适合高频调用。
七、不同上下文需要不同的转义策略
这是新手最容易踩的坑:以为做了 HTML 转义就万事大吉了。错!转义必须根据数据出现的位置来选择。
| 数据出现的位置 | 需要的转义方式 | 原因 |
|---|---|---|
| HTML 文本内容 |
HTML 实体编码(< 等) | 防止被解析为标签 |
| HTML 属性值 | HTML 实体编码 + 属性值编码 | 防止属性被截断 |
| JavaScript 字符串 |
JS 字符串编码(\xHH) | HTML 实体在 JS 中无效 |
| URL 参数 |
URL 编码(%HH) | 防止 URL 结构被破坏 |
| CSS 属性值 |
CSS 编码(\HH) | 防止 CSS 注入 |
最典型的反例:
<script> var name = "用户输入的内容"; </script>
如果用户输入 "; alert(1); //,即使你做了 HTML 实体编码,在 JavaScript 上下文中依然会突破字符串边界:
var name = ""; alert(1); //"; // JS 引擎不认识 ",它只认 ",所以依然会被截断
正确做法:在 JavaScript 上下文中,必须使用 JS 字符串编码:
var name = "\x22; alert(1); //"; // \x22 是双引号的 JS 编码
结论:HTML 实体编码只对 HTML 上下文有效。到了 JS、URL、CSS 里,必须换用对应的编码方式。这就是所谓的"上下文敏感编码",也是 XSS 防御的核心原则。
八、常见错误与避坑清单
| 错误 | 后果 | 正确做法 |
|---|---|---|
| 转义顺序错误(先转 <> 再转 &) |
产生 &lt; 这种连锁转义 | 永远先转义 & |
| 只转义 <> 忽略 & | & 被当作实体引导符,后续字符被误解析 | 五个字符全部转义 |
忘记转义单引号 ' | 属性值被单引号注入破坏 |
加上 ' 或 ' |
| 在 JS 中用 HTML 实体 | 完全无效,XSS 依然成立 |
使用 JS 字符串编码(\xHH) |
| 重复转义已转义的内容 | < 变成 &lt;,显示异常 | 判断是否已转义,或使用成熟的库 |
| 用正则手动替换遗漏字符 | 生僻字符没被转义,留下安全隐患 | 使用 DOM API 或成熟库(如 DOMPurify) |
九、工具与库推荐(别重复造轮子)
| 工具/库 | 适用场景 | 特点 |
|---|---|---|
| DOMPurify | 浏览器端清理 HTML | 自动上下文感知,XSS 防御首选 |
| he(HTML Entities) | Node.js 转义 | 轻量,支持所有 HTML 实体 |
| lodash.escape | 通用转义 | 简单够用,但只处理 <>&"' |
| OWASP ESAPI | 企业级安全编码 | 工业级标准,功能最全 |
浏览器 textContent | 简单场景 | 零依赖,最可靠 |
十、写在最后
HTML 转义字符不是什么高深技术,它是 Web 开发的"基本功",就像学开车要先学踩刹车一样。
记住三个核心点:
&、<、>、"、'这五个字符,在 HTML 中出现就必须转义转义顺序永远是:先
&,再<>,最后"'转义不是万能的,必须根据数据出现的上下文选择正确的编码方式
掌握了转义字符,你就掌握了 Web 安全的第一把钥匙。剩下的,就是在每一次写代码时,都把这把钥匙用上。
相关工具
HTML转义字符对照表
版权及免责申明:本文由@fuwa原创发布。该文章观点仅代表作者本人,不代表本站立场。本站不承担任何相关法律责任。
如若转载,请注明出处:https://www.fuwa.org/tutorials/what-are-html-escape-characters.html

