HTML 实体编解码工具

在文本与 HTML 实体之间双向转换,支持命名实体(& < ©)、十进制(&)与十六进制(&)数字实体,内置常用实体速查表。数据仅在浏览器本地处理。

HTML 实体结果0 字 · 0
所有数据仅在你浏览器内处理,不会上传到任何服务器。

常用 HTML 实体速查表

&amp;
&#38;
与号
&lt;
&#60;
小于号
&gt;
&#62;
大于号
&quot;
&#34;
双引号
&#39;
&#39;
单引号
&nbsp;
&#160;
不换行空格
&copy;
&#169;
版权符号
&reg;
&#174;
注册商标
&trade;
&#8482;
商标
&mdash;
&#8212;
破折号(长)
&ndash;
&#8211;
破折号(短)
&hellip;
&#8230;
省略号
&laquo;
&#171;
左书名号
&raquo;
&#187;
右书名号
&middot;
&#183;
中间点
&deg;
&#176;
&plusmn;
&#177;
加减号
&times;
&#215;
乘号
&divide;
&#247;
除号
&euro;
&#8364;
欧元
&pound;
&#163;
英镑
&yen;
&#165;
日元 / 人民币
&cent;
&#162;
美分
&sect;
&#167;
章节符
&para;
&#182;
段落符
&bull;
&#8226;
项目符号
&rarr;
&#8594;
右箭头
&larr;
&#8592;
左箭头
&uarr;
&#8593;
上箭头
&darr;
&#8595;
下箭头
&starf;
&#9733;
实心星

XSS 防御演示

选择典型攻击载荷,查看 HTML 实体编码前后的差异。本演示不会执行任何脚本,仅展示文本编码效果与上下文安全提示。

⚠ 危险输入原始载荷
<script>alert(document.cookie)</script>

若直接 innerHTML 渲染,浏览器会执行其中的 JavaScript,导致 XSS。

✅ 编码后HTML 实体编码
&lt;script&gt;alert(document.cookie)&lt;/script&gt;

< > " ' 被转义后,浏览器仅当文本显示,不会解析为标签或脚本。

HTML 实体编码在不同上下文的有效性

✅ 安全HTML 文本节点
<div>用户输入</div>

HTML 实体编码有效,& < > 被转义后浏览器只当文本显示,不会解析为标签。

✅ 安全HTML 属性值
<input value="用户输入">

HTML 实体编码有效,& < > " 被转义后无法逃逸属性引号,无法注入新属性。

❌ 无效<script> 块内
<script>var x = "用户输入";</script>

HTML 实体无效!JS 引擎不识别实体。需用 JSON.stringify 并转义 </script> 序列。

❌ 无效事件处理器内
<button onclick="run('用户输入')">

HTML 实体无效!需 JS 字符串转义(\ ' " \n),并配合属性上下文编码。

⚠ 需其他编码href / src 属性
<a href="用户输入">

需 URL 编码 + 协议白名单(拒绝 javascript: data: 等危险协议),仅靠 HTML 实体不够。

💡 完整 XSS 防御需配合 CSP(内容安全策略)、输入校验、上下文相关编码。详见博客《前端安全实战:CSP、XSS、CSRF 防护全景指南》

常见问题

什么是 HTML 实体?为什么需要它?

HTML 实体是用 & 开头、; 结尾的字符串表示特殊字符的机制。它有两个核心用途:①转义 HTML 语法字符(如 < > & "),避免它们被解析为标签或属性边界,防止 XSS 与显示错误;②输入键盘上难以直接输入的符号(如 © ©、® ®、 ™、 —)。

命名实体、十进制、十六进制有什么区别?

三种写法表示同一个字符:&amp; = &#38; = &#x26;,都表示与号 &命名实体用易记的名字(amp、lt、copy),但只能表示 HTML 规范中预定义的字符;十进制&#NN; 表示任意 Unicode 码点;十六进制&#xNN; 表示,常用于代码生成与编程场景。三者可混用,浏览器都会正确解析。

三种编码模式有什么区别?该如何选择?

本工具提供三种编码模式:
仅必要字符:只转义 & < > " ',保留中文与符号原样。适用于在 HTML 文档中安全显示用户输入的内容。
命名实体优先:必要字符 + 命名实体表中的符号(© ® ™ … 等)优先用命名形式,其余非 ASCII 用数字实体。可读性最好,适合邮件、文档场景。
全部数字实体:所有非 ASCII 字符(含中文)都转为 &#NN;。体积最大但兼容性最高,适合纯 ASCII 通道(如老式邮件、XML 声明前的字符)。

解码时用的是什么方法?支持所有 HTML5 实体吗?

本工具使用浏览器原生 DOMParser 解码,支持 HTML5 规范中定义的所有命名实体(包括 &copy; &reg; &trade; &mdash; 等数百个),以及十进制 &#NN; 与十六进制 &#xNN; 数字实体。比手写映射表更完整、更准确。

HTML 实体能防止 XSS 攻击吗?

能且不能。:在输出用户输入到 HTML 文本节点或属性值之前进行 HTML 实体编码,是防止 XSS 的标准做法(OWASP 推荐)。不能:实体编码仅在 HTML 上下文有效,如果你把用户输入插入到 <script> 内、事件处理属性(如 onclick)内、或 URL 上下文(如 href),仍可能被绕过。完整防御需配合 CSP、输入校验、上下文相关编码。本工具内置XSS 防御演示模块(见页面下方),可选择 <script> 注入、onerror 事件、javascript: 协议等典型载荷,实时查看编码前后差异与上下文安全提示。详细原理参见博客《前端安全实战:CSP、XSS、CSRF 防护全景指南》

XSS 防御演示模块会执行脚本吗?安全吗?

不会执行任何脚本,完全安全。演示模块仅以纯文本形式展示攻击载荷的原始内容与 HTML 实体编码后的结果,所有内容通过 React 文本节点渲染(自动转义),浏览器不会将其解析为可执行代码。你可以放心选择任意预设载荷查看编码效果。模块还提供上下文安全提示表,标注 HTML 实体编码在「HTML 文本节点 / 属性值 / <script> 块内 / 事件处理器 / href 属性」五种上下文的有效性,帮助你理解为什么单一编码不能防住所有 XSS。

&amp; 与 & 的区别?为什么会出现双重编码?

这是常见的双重编码问题。如果文本已经是 &amp;(表示字符 &),但被错误地再次编码,会变成 &amp;amp;,显示为字面量 &amp; 而非字符 &。常见于后端已编码一次、前端再次编码的场景。本工具不会重复编码已编码的实体(必要字符优先匹配),但仍建议在编码前确认输入是否已是实体形式。

为什么 &nbsp;(不换行空格)和普通空格不一样?

&nbsp;(码点 U+00A0)和普通空格(U+0020)是不同的字符。不换行空格不会被浏览器换行截断,常用于防止「100 kg」被拆成两行;HTML 中连续多个 &nbsp; 都会显示,而连续普通空格会被合并为一个。但 &nbsp; 不应被滥用做缩进,应使用 CSS 的 marginpadding

数据会上传到服务器吗?

不会。本工具完全在浏览器内运行,所有处理逻辑由 JavaScript 在你本地执行,输入内容不会发送到任何服务器。