什么是HTML 实体编码/解码器?

HTML 实体编码/解码器可将 <、>、& 及引号等特殊字符与其 HTML 实体表示(如 &lt;、&gt;)相互转换。这可有效防止在 HTML 中嵌入用户内容时产生 XSS 漏洞,并解决特殊字符的显示异常问题。

编码器将 <, >, &, ", ' 等字符和任何 Unicode 码点转换为命名实体(&amp;, &lt;)、十进制数字引用(&#38;)或十六进制数字引用(&#x26;)。范围选择器允许只编码五个保留字符、所有特殊字符或每个非 ASCII 字符。解码可还原三种格式中的任意一种。适用于为 HTML 输出净化用户输入或从 HTML 邮件导出中恢复文本。

使用方法

  1. 第一步 — 粘贴含有特殊字符或 HTML 实体的文本。
  2. 第二步 — 选择编码将字符转换为实体,或选择解码将实体还原为字符。
  3. 第 3 步 — 选择格式(命名、十进制或十六进制)和范围来控制编码强度。

何时使用

  • 把代码示例贴进 CMS,避免 < 和 > 被当成 HTML 标签而消失。
  • 整理从 HTML 邮件或抓取页面里复制下来,还残留着 &mdash;、&nbsp; 的文本。
  • 在服务端模板里输出用户输入前先做转义,避免 XSS 注入。

结果

您需要在 HTML 段落中展示代码片段 <div class=hero>。对其进行编码,得到 &lt;div class=&quot;hero&quot;&gt;,本地将以文本形式渲染,而不会将其解析为 HTML 标签。

常见问题

命名实体和数字实体有什么区别?
命名实体用可读的简写,例如 &copy; 表示 ©。数字实体用 Unicode 码点,例如 &#169; 或十六进制 &#xA9;。数字实体能表示任何 Unicode 字符;命名实体只覆盖 HTML5 规范定义的约 250 个字符。
是不是所有特殊字符都要编码?
在 HTML 正文中只需编码 & < > 以及属性值用到的引号。在 JavaScript 或 URL 上下文中规则不同。范围选择器提供三种选择:仅保留字符 — 针对五个 XSS 关键字符,所有特殊字符 — 在保留字符之外加入排版符号,所有非 ASCII — 提供最全面的覆盖。
编码后会不会影响复制粘贴或屏幕阅读器?
不会。浏览器在渲染前会先把实体解码,用户看到和复制到的都是原始字符。屏幕阅读器拿到的也是解码后的文本。实体只是标记语言里的传输形式,不是最终展示。
光做 HTML 实体编码能防住 XSS 吗?
对放在 HTML 正文里的内容,够了。放在属性里还要给属性加引号并把引号字符一起编码。JavaScript、CSS、URL 这些上下文有各自的转义规则,编码只是第一层防护,不是全部。
为什么有的实体写 &#x,有的只写 &#?
&#x 后面跟的是十六进制码点,&# 后面是十进制。两者指向同一个字符,例如 &#xA9; 和 &#169; 都是 ©。十六进制和 Unicode 表里 U+ 写法对应,高位码点写起来更短。

相关工具