HTML 实体编码

把 < > & 和引号等特殊字符转换为 HTML 实体,也可把实体解码回文本。免费的在线 HTML 转义与反转义工具。

如何转义或反转义 HTML

  1. 要把特殊字符变成实体,选择编码(转义);要把实体还原成普通字符,选择解码(反转义)。
  2. 把文本或标记粘贴到上方输入框,下方结果会随输入实时变化。
  3. 编码时,如果结果要经过只能处理纯 ASCII 的系统,请勾选同时编码非 ASCII 字符。
  4. 点击复制,或点击⇅ 互换把结果放回输入框并切换到相反模式,确认能得到原来的文本。

编码会替换哪些字符

编码只替换五个字符,它们都可能改变浏览器对页面的解析方式:

字符替换为原因
&&amp;它是实体的开头,单独出现可能被误读
<&lt;开启标签
>&gt;结束标签
"&quot;结束用双引号包围的属性值
'&#39;结束用单引号包围的属性值

这五个字符是一次性替换的,所以转义过程中新加入的 & 不会被再次转义。其他字符,如弯引号、带重音的字母、中文、表情符号,在不勾选非 ASCII 选项时保持原样。勾选后,所有 ASCII 以外的字符都会根据其 Unicode 码位写成十进制数字引用:é 变成 &#233;,€ 变成 &#8364;,中 变成 &#20013;,😀 变成 &#128512;。

解码能识别 HTML 定义的全部命名实体(&eacute;、&nbsp;、&hearts; 等),以及十进制(&#233;)和十六进制(&#xE9;)引用。输入中的标签只会作为文字保留,不会被渲染或执行。

示例

在博客文章中展示代码

粘贴 if (a < b && b > c),编码结果是 if (a &lt; b &amp;&amp; b &gt; c)。把它放进 <pre><code> 中,读者看到的就是原来的代码,页面也不会错乱。

含引号和排版符号的标记

输入框中的示例 <p class="note">Tom & Jerry’s “best” café</p> 会变成 &lt;p class=&quot;note&quot;&gt;Tom &amp; Jerry’s “best” café&lt;/p&gt;。勾选非 ASCII 编码后,弯撇号、弯引号和 é 也会被替换:Jerry&#8217;s &#8220;best&#8221; caf&#233;。

修复被转义两次的文本

如果页面上本该显示 & 的地方显示成了 &amp;(如 Tom &amp; Jerry),说明文本在保存时转义了一次,显示时又转义了一次。先解码一次并检查结果,只有仍残留实体时才再解码。根本的解决办法是只在输出时这一个环节进行转义。

转义与跨站脚本攻击(XSS)

如果网站不经转义就把用户输入插入页面,访问者就可以提交 <img src=x onerror="alert(1)"> 之类的内容,让浏览该页面的每个人的浏览器执行它。经过转义后,同样的输入变成 &lt;img src=x onerror=&quot;alert(1)&quot;&gt;,只会作为无害的文字显示。

这种转义保护的是两个位置:标签之间的文本,以及用引号包围的属性值。在 <script> 块、内联事件处理器、CSS、没有引号的属性以及 href 等 URL 中,它并不够——例如 javascript: 链接根本不需要任何特殊字符。在实际应用中,请依靠模板引擎的自动转义,这个工具则用来检查或准备单个字符串。

小贴士

  • 以 UTF-8 保存的页面可以直接包含 é、ü、中文、한글,刻意编码只会让源代码更难读。非 ASCII 选项适用于老式邮件模板、旧版 CMS 字段,或你无法控制编码的文件。
  • &nbsp; 解码后是不换行空格(U+00A0),看起来像空格却不是空格,可能导致程序中的搜索和比较失败。需要精确匹配时请把它替换掉。
  • 实体只属于 HTML 和 XML。链接请使用 URL 编码;JSON 字符串中请使用 JSON 自己的转义(字符串是否有效可以用 JSON 格式化检查)。

常见问题

&#39; 和 &apos; 有什么区别?

两者都表示撇号。&apos; 在 XML 和 HTML5 中有定义,但 HTML 4 中没有。数字形式 &#39; 在所有浏览器和邮件客户端中都能使用,所以本工具采用它。

应该用命名实体还是数字引用?

两者解码后是同一个字符。&copy; 这样的命名实体更易读;数字引用适用于所有 Unicode 字符,而命名实体只覆盖其中一部分。

为什么普通文本中的 > 可以不转义?

严格来说,文本中单独的 > 是无害的,必须转义的只有 < 和 &。统一转义全部五个字符,同样的结果放进带引号的属性中也是安全的。

解码时会执行我粘贴的代码吗?

不会。解码只是把实体转换成字符,结果以纯文本形式显示在只读文本框中。