tigtools

HTML 实体编码器 / 解码器

让文本可以安全地放入 HTML,也可将 & 和 é 等实体还原为普通字符。

在浏览器中运行 无需注册

方向

& < > " 和 ' 始终会被转义。只有选择非 ASCII 字符选项后,其他字符才会转换。

使用方法

  1. 选择“编码”以确保文本可安全用于 HTML,或选择“解码”将实体还原为字符。
  2. 编码时,可选择保留重音字母和符号,或将它们转换为实体。
  3. 输入或粘贴文本,结果会即时更新。
  4. 复制结果,或使用“将输出用作输入”检查解码后是否还原为原文。

工作原理

在 HTML 中,少数字符具有特殊含义:< 用于开始标签,& 用于开始实体," 或 ' 用于结束属性值。若要将它们显示为文本,必须写成字符引用:< 对应 &lt;,> 对应 &gt;,& 对应 &amp;," 对应 &quot;,' 对应 &#39;。撇号使用数字形式,因为 &apos; 在 HTML 4 中未定义。

保存和提供页面时,只要使用现代网站默认的 UTF-8 编码,其他所有字符(包括带重音符号的字母、中文和 emoji)都可以直接书写。只有对某些不兼容 UTF-8 的系统(例如一些旧版邮件模板或数据库),才需要将这些字符转换为实体。此时可以选择有常用名称的命名实体(其余字符使用数字形式),例如 &eacute;;也可以为每个字符都使用数字引用,例如 &#xE9;。

解码时不会使用浏览器的 HTML 解析器,而是使用内置表格,其中包含 HTML 4.01 的全部 252 个命名实体、&apos; 和约 30 个常见 HTML5 名称,以及十进制和十六进制引用。数字引用遵循 HTML5 规则:&#0;、代理项值和大于 U+10FFFF 的值会转换为替换字符 �;值为 128–159 的字符按 Windows-1252 处理,因此 &#150; 会变成短破折号。浏览器也接受少数不带结尾分号的旧式名称,例如 &amp 和 &copy。HTML5 定义了 2,000 多个名称;表格中未收录的少见名称会保持不变,并列出供参考。

在将文本插入 HTML 之前进行转义,是防御跨站脚本攻击(XSS)的重要措施,但这种做法仅适用于元素内容和带引号的属性值。放在 <script> 块、style 属性或 URL 中的文本需要使用不同的转义方式。

示例

在网页上显示代码

若要在博客文章中将 <div class="box"> 显示为文本,可将其编码为 &lt;div class=&quot;box&quot;&gt;。浏览器会显示原始标签,而不会创建元素。

为旧版邮件模板准备文本

选择“有对应名称时使用命名实体”后,“Café – 5 €”会变为 Caf&eacute; &ndash; 5 &euro;,即使邮件使用非 UTF-8 字符集发送,也能正确显示。

清理抓取或导出的文本

某个 CMS 导出内容中包含 Fish &amp; Chips &#8211; &pound;9。解码后得到 Fish & Chips – £9,可直接粘贴到电子表格中。

常见问题

HTML 中哪些字符必须转义?

在元素内容中,必须转义 & 和 <(也建议转义 >)。在属性值中,还要转义用于括起属性值的引号。无论何处都转义全部五个字符(& < > " '),是本工具采用的简单安全规则。

命名实体和数字实体有什么区别?

&copy; 这样的命名实体更易读,但只适用于有限的一部分字符。&#169;(十进制)或 &#xA9;(十六进制)这样的数字引用适用于所有 Unicode 字符,包括表情符号。

为什么 &nbsp; 解码后看起来像空格?

&nbsp; 是不换行空格(U+00A0)。它看起来和普通空格一样,但会阻止换行,而且不会被 HTML 合并。它与普通空格是不同的字符,在比较或搜索文本时需要注意这一点。

é 这样的重音字母需要编码吗?

如果页面使用 UTF-8(<meta charset="utf-8">),就不需要;几乎所有现代网页都使用 UTF-8。保留默认设置即可,只有五个特殊字符会被转义。

编码足以防止 XSS 吗?

对于插入 HTML 元素内容或带引号的属性值中的不可信文本,这样就足够了。但对于 JavaScript 代码、CSS、无引号的属性或 href="javascript:…" 这样的 URL,这样做还不够;这些内容需要根据具体上下文进行处理。

隐私

编码和解码均在浏览器中通过普通字符串操作完成;文本不会被渲染为 HTML、上传、存储或纳入分析。