html 转义字符也叫 html 实体字符,核心作用就是把 html 里面本身拥有特殊含义的符号,转换成浏览器不会当成标签解析的文本形式,让这些符号可以正常显示在网页页面上。html 本身是标记语言,尖括号引号等符号本身是用来写标签的,如果直接在页面正文写尖括号,浏览器会误以为这是标签代码,直接解析,不会把它当成普通文字展示,这个时候就必须使用 html 转义字符。除了尖括号之外,空格版权符号注册商标符号等特殊符号,也可以使用 html 转义字符来输出,它有两种书写形式,一种是名称实体,一种是数字实体,两种写法最终渲染出来的显示效果是一样的。很多新手写教程页面,想要展示 html 源码的时候,最容易踩这个坑,源码里面的标签直接被浏览器解析,页面看不到代码,解决办法就是全部替换成 html 转义字符。
为什么需要 html 转义字符
html 解析器读取页面代码的时候,会优先识别标记符号,小于号和大于号是标签的标志性符号,浏览器看到之后就会尝试解析成 html 标签。如果业务需求只是单纯展示这个符号,并不是要创建标签,就会出现冲突,html 转义字符就是解决这个解析冲突。另外还有部分字符属于保留字符,在文档里面直接书写会出现解析歧义,使用转义字符之后,浏览器识别到实体编码,就知道这只是普通文本,不会进行标记解析。
常用 html 转义字符对照表
| 原始符号 | 名称实体 | 数字实体 | 说明 |
|---|---|---|---|
| < | lt | < | 小于号 |
| > | gt | > | 大于号 |
| & | amp | & | 和号,这个符号是实体编码开头标记,必须转义 |
| " | quot | " | 双引号 |
| ' | apos | ' | 单引号 |
| 空格 | nbsp | 不换行空格,多个空格不会被浏览器合并 | |
| © | copy | © | 版权符号 |
| ® | reg | ® | 注册商标符号 |
| × | times | × | 乘号 |
| ÷ | divide | ÷ | 除号 |
两种书写格式说明
名称实体格式,是 amp 后面跟上分号,也就是以名称加末尾分号组成,可读性更好,写代码推荐这种写法。
数字实体格式,是井号加上十进制编码,或者井号 x 加上十六进制编码,后面同样带分号,这种写法适合批量生成,不需要记忆实体名称。
重点提醒,所有 html 转义字符结尾的分号不能漏掉,漏掉分号浏览器有可能识别失败,无法正确转义成目标符号。
典型使用场景
1 网页里面展示 html 源代码,比如教程文档,需要把标签尖括号全部转为 html 转义字符,防止浏览器直接渲染标签
2 文本内容里面包含和号,因为和号本身是实体编码起始字符,如果不转义,浏览器会尝试识别成实体,造成显示异常
3 输出版权商标这类键盘不容易输入的特殊符号,直接使用 html 转义字符输出
4 属性值内部包含引号,在标签属性里面如果需要写双引号,可以使用 quot 转义,避免和属性外层引号冲突
前端 js 自动转义相关方法
如果需要批量把普通字符串转换成 html 转义字符,前端可以利用 dom 特性自动转换,不需要手动逐个替换,这个在动态渲染用户输入内容的时候非常重要,同时这个操作也可以防范基础的 xss 风险,把用户输入里面的尖括号转义,防止恶意标签被浏览器执行。
对应的反向操作叫做解码,也就是把 html 转义字符还原成原始符号,比如拿到后台返回的带实体编码文本,需要解码之后再展示原始内容。
容易混淆知识点区分
html 转义字符和 url 百分号编码不是同一个东西,html 转义字符是针对网页文档解析,作用是防止标签解析冲突,url 编码是针对 url 传输,解决特殊字符网络传输问题,二者编码格式用途完全不一样,不要混为一谈。
还有一个高频误区,nbsp 这个空格和普通空格不一样,nbsp 属于不间断空格,浏览器不会自动合并多个 nbsp,普通空格在 html 里面连续多个会被压缩成单个空格,这是很多排版的时候经常用到的特性。
常见踩坑点
1 忘记末尾分号,html 转义字符识别失败
2 混淆 html 转义字符和 url 编码,错误套用编码
3 动态拼接 html 的时候,没有对用户输入内容做 html 转义字符处理,引发 xss 安全隐患
4 转义之后又重复转义,出现双重编码,页面显示出 amp lt 这类实体代码本身
【常见问题】
问题 1 html 转义字符主要解决什么问题
回答 1 html 转义字符主要解决特殊符号被浏览器当成 html 标签解析的问题,让尖括号这类符号可以作为普通文字正常显示。
问题 2 html 转义字符结尾的分号可以省略吗
回答 2 html 转义字符结尾的分号不建议省略,绝大多数浏览器要求完整带分号,缺少分号容易导致 html 转义字符解析失败。
问题 3 html 转义字符和 url 编码是一样的吗
回答 3 html 转义字符和 url 编码不一样,html 转义字符用于网页文档防标签解析,url 编码用于链接传输,二者属于两套独立编码体系。
问题 4 html 转义字符可以用来防止 xss 吗
回答 4 html 转义字符可以对用户输入的尖括号引号进行转义,是基础 xss 防护手段之一,动态渲染内容时使用 html 转义字符可以降低安全风险。
【免责申明】
本文内容基于 html 标准规范整理,仅用于 html 转义字符入门学习,不同浏览器对部分实体字符兼容细节存在差异,正式项目请参考 W3C 官方规范,本文不替代官方标准文档。


