首页/开发/正则与编码速查/HTML 命名实体与数字实体

HTML 命名实体与数字实体

命名实体可读性好但依赖规范版本(HTML 定义了大量名字,XML 只有五个内置),数字实体(十进制 © 或十六进制 ©)可表示任意 Unicode 码点;需要覆盖性与一致性时用数字形式,追求可读性时用命名形式。

正则与编码速查开发更新于 2026-10-17
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​​​‌​‌‌​‌​‌‌​‌‌‌​​‌‌​​​​‌​‌‌​‌‌​‌​‌‌​​‌​‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌‌​‌‌​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌​‌‌‌​​‌‌‌​‌​‌​‌‌​‌‌​‌​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​​​‌‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌‌​‌​​​‌‌​‌​​‌​‌‌‌​‌​​​‌‌‌‌​​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​

两种引用的取舍

命名实体用名字引用字符,可读性最好,但可用名字随规范版本变化:HTML 定义的实体集合远多于 XML 的五个内置实体(< > & " '),因此在 XML、SVG、RSS 等场景直接写 HTML 命名实体会被判为未定义实体而解析失败。数字实体用码点引用,形式为十进制 © 或十六进制 ©,能表示任意 Unicode 码点,覆盖面完整、跨版本稳定,代价是可读性差。实践中常见组合是:常用符号用命名实体,其余用数字实体。

基本信息

命名实体以名字引用,可读性好,集合依规范版本而定
数字实体十进制 © 或十六进制 ©,可表示任意码点
XML 内置只有 < > & " ' 五个
大小写命名实体区分大小写,写错不会解析
结束分号现代写法必须带分号
安全建议不可信输入场景优先数字形式,减少解析差异

典型使用场景

  • XML 与 SVG 内容:只用内置命名实体或数字实体,避免未定义实体报错
  • 邮件模板:邮件客户端对命名实体支持较全,但仍建议保守使用
  • 富文本净化:把内容统一转换为数字实体,便于后续处理与比较
  • 跨系统交换:数字形式不受命名集合差异影响,兼容性更好
  • 可读性维护:面向人工编辑的模板可保留常用命名实体

转换与对照示例

转换与对照示例
# 命名与数字形式等价
python -c "import html; print(html.unescape('©'), html.unescape('©'), html.unescape('©'))"
# 把字符转成数字实体(避免依赖命名集合)
python -c "print(''.join('&#%d;' % ord(c) for c in '©®中'))"
# XML 场景:内置命名实体之外的写法会解析失败
python -c "import xml.etree.ElementTree as ET; ET.fromstring('<a>&copy;</a>')" 2>&1 | tail -1
python -c "import xml.etree.ElementTree as ET; print(ET.fromstring('<a>&#169;</a>').text)"   # 数字实体正常
# 名字区分大小写,未定义的名字按字面返回
python -c "import html; print(repr(html.unescape('&notanentity;')))"

形式对照

需求推荐形式原因
常用符号、可读性优先命名实体模板易读易维护
任意 Unicode 码点数字实体覆盖完整,不受命名集合限制
XML / SVG 内容内置命名实体或数字实体其他命名实体会被判定未定义
不可信输入的回显数字实体解析行为确定,减少歧义
批量转换与比较数字实体形式统一,字符串比较可靠
命名实体的集合随规范版本变化:某些名字在旧版规范中未定义,在较新版本中被加入。因此对解析器与库的版本要有意识,跨系统传递内容时优先选择数字形式以获得稳定行为。
实体解析差异可能被用于绕过过滤:不同解析器对未知实体、缺失分号、重载字符的处理不同,攻击者可构造在「校验器」与「浏览器」中解析结果不同的内容。安全场景应统一使用数字实体并规范解析流程。
转换需要保持语义:把内容统一转换为数字实体属于表示层面的改写,不会改变字符本身;但若中途经过一次转义再转义,就会出现「实体被显示成实体文本」的问题,转换前后都应做往返验证。

易错点

  • 在 XML 内容中使用 HTML 命名实体:解析器报未定义实体,文档无法加载 → 改用内置实体或数字实体
  • 命名实体大小写写错:内容静默按字面显示,看起来像排版问题 → 核对实体名拼写与大小写
  • 省略分号:与后续字符连读成另一个实体,内容被静默改写 → 一律补全分号
  • 依赖旧版规范未定义的名字:在不同版本解析器上表现不同 → 使用数字实体或验证目标解析器
  • 多次实体转换:出现显示为 &amp;lt; 的双重转义内容 → 只在输出边界转换一次并做往返校验

数据来源与参考

  • WHATWG HTML 标准:命名字符引用列表
  • XML 1.0 规范:预定义实体与字符引用
  • W3C:字符编码与实体引用相关说明

整理校对:其其网ICT文档中心 · 本页地址:docs.qiqicto.com/regex/html-named-vs-numeric-entity.html

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌​​‌​‌‌‌‌​‌‌‌​​‌​​‌‌​​‌​‌​‌‌​​‌‌‌​‌‌​​‌​‌​‌‌‌‌​​​​​‌​‌‌‌‌​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​​​‌​‌‌​‌​‌‌​‌‌‌​​‌‌​​​​‌​‌‌​‌‌​‌​‌‌​​‌​‌​‌‌​​‌​​​​‌​‌‌​‌​‌‌‌​‌‌​​‌‌‌​​‌‌​​‌​‌‌​‌​‌‌​‌‌‌​​‌‌‌​‌​‌​‌‌​‌‌​‌​‌‌​​‌​‌​‌‌‌​​‌​​‌‌​‌​​‌​‌‌​​​‌‌​​‌​‌‌​‌​‌‌​​‌​‌​‌‌​‌‌‌​​‌‌‌​‌​​​‌‌​‌​​‌​‌‌‌​‌​​​‌‌‌‌​​‌​​‌​‌‌‌​​‌‌​‌​​​​‌‌‌​‌​​​‌‌​‌‌​‌​‌‌​‌‌​​