HTML 实体编码完全参考:特殊字符转义与解码指南

HTML 实体编码完全参考:特殊字符转义与解码指南

HTML 实体是 HTML 表达特殊字符的机制——那些直接写入会被解析器误读的字符,比如会被当作标签起始符的尖括号,或者特殊符号如版权标志、货币符号。实体用错了,轻则页面显示乱码,重则产生 XSS 漏洞。本文覆盖常用实体参考、转义规则,以及在代码中如何正确编解码。

什么是 HTML 实体?

HTML 实体是以 & 开头、; 结尾的字符串,代表单个字符。有两种形式:

命名实体使用描述性关键词:

< → <

> → >

& → &

" → "

  → (不换行空格)

数字实体使用 Unicode 码点,支持十进制和十六进制:

< → < (十进制)

< → < (十六进制)

© → ©

© → ©

两种形式输出结果完全相同。命名实体可读性强;数字实体覆盖所有 Unicode 字符,包括没有命名实体的字符。

为什么要用 HTML 实体?

防止 HTML 结构被破坏

< 和 > 在 HTML 中有特殊含义。如果需要在页面上显示字面上的尖括号,必须转义:

推荐使用 而非 来加粗文本。

推荐使用 <strong> 而非 <b> 来加粗文本。

防止 XSS 漏洞

把用户输入直接拼接进 HTML 是最常见的 Web 安全漏洞之一。如果用户输入 ,而你的代码原封不动地输出,这段脚本就会在每个访客的浏览器上执行。

你好,<%= username %>

你好,<%= htmlEncode(username) %>

对所有插入 HTML 的用户输入,必须转义这五个字符:

字符实体&&<<>>""''

兼容不同字符集环境

在 UTF-8 成为标准之前,Latin-1 编码的文档无法直接表示 ©、€、— 等字符,实体是当时的解决方案。现代项目统一用 UTF-8,这类字符可以直接写入 HTML,但实体在某些遗留系统或限制环境中仍有用。

常用 HTML 实体速查

保留字符

字符说明命名实体数字实体<小于号<<>大于号>>&和号&&"双引号""'单引号''

排版符号

字符说明实体使用场景 不换行空格 防止两个词之间换行—破折号(长)—句子中断、范围表示–短横线(中)–数字范围(2010–2024)…省略号…文字截断"左双引号“引用"右双引号”引用

常用符号

字符说明实体©版权©®注册商标®™商标™€欧元€£英镑£¥日元/人民币¥°度°±正负号±×乘号×÷除号÷→右箭头→←左箭头←

数学符号

字符说明实体≤小于等于≤≥大于等于≥≠不等于≠∞无穷大∞∑求和∑√根号√

在代码中编解码

JavaScript

浏览器环境借助 DOM 实现编解码:

// 编码(转义 HTML)

function htmlEncode(str) {

const div = document.createElement('div');

div.appendChild(document.createTextNode(str));

return div.innerHTML;

}

htmlEncode('');

// "<script>alert(1)</script>"

// 解码

function htmlDecode(str) {

const div = document.createElement('div');

div.innerHTML = str;

return div.textContent;

}

htmlDecode('<b>加粗</b>');

// "加粗"

Node.js 环境(无 DOM)使用 he 库:

npm install he

import he from 'he';

he.encode('');

he.decode('<b>加粗</b>');

Python(标准库)

import html

# 编码

html.escape('')

# '<script>alert(1)</script>'

# 编码(包含单引号)

html.escape("这是'测试'", quote=True)

# '这是'测试''

# 解码

html.unescape('<b>你好 & 世界</b>')

# '你好 & 世界'

PHP

// 编码(安全输出到 HTML)

htmlspecialchars('', ENT_QUOTES, 'UTF-8');

// <script>alert(1)</script>

// 编码所有适用字符

htmlentities('© 2024', ENT_QUOTES, 'UTF-8');

// © 2024

// 解码

html_entity_decode('<b>加粗</b>', ENT_QUOTES, 'UTF-8');

// 加粗

什么时候编码,什么时候不需要

必须编码的情况: 把用户输入、外部 API 数据或任何不可信内容插入 HTML 时,一定要编码。

避免重复编码: 如果内容已经编码过(数据库里存的是 <),再编码一次会得到 &lt;,页面上显示的是字面字符串 < 而不是 <。

UTF-8 文档直接用 Unicode 字符: 现代项目统一 UTF-8,©、€、→ 可以直接写入 HTML,不需要实体。只有在遗留系统或字符集受限的邮件模板等场景才需要使用实体。

  少用:   常被用来充当间距或防止换行。现代 CSS 的 white-space: nowrap 或 word-break 更可维护,可以替代大多数   的使用场景。

在线快速查询

需要找某个字符的实体,或者看到源码里的实体想知道它代表什么,用在线工具最快。试用 ZeroTool HTML 实体编解码工具 →

粘贴含有实体的 HTML 文本即可解码,输入特殊字符即可获取对应实体。适合用来:

解码 CMS 导出内容中的乱码实体

查找某个视觉符号的对应实体名称

验证模板转义是否正确生效

小结

HTML 实体的核心用途只有两个:一是显示保留字符而不破坏 HTML 结构,二是转义用户输入防止 XSS。现代 UTF-8 文档里,日常只需要记住 <、>、&、" 和 ' 这五个,其他字符直接用 Unicode 写即可。

立即使用 HTML 实体编解码工具 →

🌟 相关推荐

我的安吉拉贴纸怎么获得 贴纸有多少
365bet亚洲版体育在线

我的安吉拉贴纸怎么获得 贴纸有多少

📅 02-04 👀 8066
提升原生分辨率、登陆 PS5 / Xbox Series:经典休闲游戏《战斗砖块剧场》将获更新
虎牙直播和YY直播什么关系?
365bet亚洲版体育在线

虎牙直播和YY直播什么关系?

📅 10-28 👀 5907