🔧Toolify

HTML实体编码和解码在线工具

粘贴文本以将特殊字符编码为HTML实体,或粘贴带实体的HTML以将其解码回可读文本。可在命名实体(&、<、©)、十进制数字(©)或十六进制(©)编码之间选择。还可选择对所有非ASCII字符进行编码以获得最大兼容性。

编码输出

工作原理

什么是HTML实体?

HTML实体是用于表示在HTML中具有特殊含义或无法直接输入的字符的特殊文本代码。最重要的是HTML语法中保留的五个字符:&(与号)→ &amp;、<(小于号)→ &lt;、>(大于号)→ &gt;、"(双引号)→ &quot; 以及 '(单引号)→ &apos;。如果这些字符在文本内容中未经编码出现,浏览器可能会将其解释为HTML标记,从而导致渲染错误或安全漏洞。

HTML实体有三种格式:命名实体使用描述性名称(&copy; 表示 ©,&euro; 表示 €),十进制数字字符引用使用码点编号(&#169; 表示 ©),十六进制字符引用使用十六进制代码(&#xA9; 表示 ©)。三种格式完全等价——无论使用哪种格式,浏览器都会渲染相同的字符。命名实体可读性最强;数字实体最为通用,因为它适用于任何Unicode字符。

何时需要编码HTML实体

每当文本内容或属性值中出现五个保留HTML字符(&、<、>、"、')时,至少必须对它们进行编码。不进行编码是跨站脚本(XSS)漏洞的根源:如果用户输入未经编码直接插入HTML,攻击者可以注入script标签或事件处理程序。React、Vue和Angular等现代框架默认自动对HTML进行编码——innerHTML是主要例外,手动编码在这里仍然至关重要。

除了必须编码的五个字符外,对于不能可靠处理UTF-8的环境,您可能还需要对非ASCII字符进行编码:HTML电子邮件、旧版CMS系统或追求最大兼容性的文档。「编码所有非ASCII字符」选项会将码点127以上的每个字符转换为数字实体,确保输出为纯ASCII,同时保留渲染时的视觉外观。对于现代UTF-8 HTML文件,对非ASCII字符进行编码是可选的——正确声明字符集即可。

HTML实体 vs URL编码 vs Base64

HTML实体、URL编码(百分号编码)和Base64是用于不同场景的三种编码方案。HTML实体(如 &amp;)用于在HTML文档中安全地表示字符。URL编码(如 %26 表示 &)用于在查询字符串和URL中对具有特殊含义的字符进行编码。Base64将任意二进制数据编码为ASCII文本,用于数据URI和电子邮件附件。

常见错误是将它们混淆:对HTML内容使用URL编码,或对URL使用HTML编码。例如,URL查询字符串中的与号需要百分号编码(%26),而非HTML实体编码(&amp;)。如果构建的URL随后嵌入HTML属性中,则两者都需要:URL编码的形式放入属性,属性值本身进行HTML编码。理解哪种编码适用于哪种上下文,可以防止双重编码错误和安全问题。

常见问题

与号(&)的HTML实体是什么?

与号的HTML实体是 &amp;——字面上由 &、a、m、p 和分号组成。在HTML源代码中写 &amp; 时,浏览器会显示单个 & 字符。每当与号出现在文本内容或属性值中时,必须进行此编码,因为未编码的 & 会开始一个实体序列,解析器会尝试对其进行解释。

版权符号(©)的HTML实体是什么?

版权符号 © 有三个等价的HTML实体:命名实体 &copy;、十进制数字实体 &#169; 和十六进制实体 &#xA9;。三者都渲染相同的 © 字符。命名实体是最具可读性的选项。对于现代UTF-8 HTML,只要HTML文件声明了 charset=utf-8,也可以直接输入 © 字符,无需使用实体。

在HTML中需要对引号进行编码吗?

在双引号分隔的HTML属性内,双引号(")必须编码为 &quot;,例如:<input value="&quot;">。在单引号分隔的属性内,单引号(')必须编码为 &apos; 或 &#39;。在元素文本内容中(标签之间),两种引号都可以不编码出现,但编码也无妨。在所有上下文中一致地对两者进行编码是最安全的做法。

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

命名实体使用描述性词语(&copy;、&euro;、&hearts;),在HTML规范中定义——并非每个Unicode字符都有命名实体。数字实体使用Unicode码点,可以是十进制(&#8364; 表示 €)或十六进制(&#x20AC; 表示 €)。数字实体适用于任何Unicode字符,而命名实体只覆盖其中一个子集。两者在浏览器中的渲染效果完全相同。

在HTML中需要对非ASCII字符进行编码吗?

通常不需要。如果HTML文档声明了UTF-8编码(meta charset=utf-8)并以UTF-8保存,则可以直接写入非ASCII字符:é、ñ、中、🎉。将它们编码为实体是可选的,会使源代码更难阅读。例外情况是在可能无法保留编码的场景中发送HTML:电子邮件、旧版API或会破坏非ASCII字节的系统。在这些情况下,将所有非ASCII字符编码为数字实体可确保输出为纯安全ASCII。

什么是XSS?HTML实体如何防止它?

跨站脚本(XSS)是一种安全漏洞,攻击者通过插入服务器在未经编码的情况下反映到HTML中的文本,将恶意JavaScript注入网页。例如,如果用户输入 <script>alert('xss')</script> 直接插入页面,浏览器就会执行该脚本。如果正确编码输入——将 < 转换为 &lt;,将 > 转换为 &gt;——浏览器会将文本原样显示,而不是将其解析为标签。HTML实体编码是防御反射型和存储型XSS的主要手段。

为什么 &nbsp; 不出现在此工具的列表中?

此工具对具有命名实体的字符进行编码。当您输入实际的不间断空格字符(在某些系统上可通过Alt+Space插入,或从字符映射表复制)时,不间断空格(Unicode U+00A0)将被编码为 &nbsp;。普通空格(U+0020,空格键)不会被编码,因为它是安全的ASCII字符。如果输出中特别需要 &nbsp;,请在输入中键入或粘贴不间断空格字符。

可以用此工具防止用户输入中的HTML注入吗?

可以——在将用户提供的文本插入HTML之前对其进行编码,是防御HTML注入和XSS的核心手段之一。至少需要编码五个保留字符:&、<、>、"、'。此工具对这五个字符全部进行编码。但是,仅靠编码并不是完整的安全解决方案:还需要适当的Content Security Policy标头、谨慎处理属性中的javascript: URL以及框架级保护措施。对于生产应用,请使用专为安全设计的服务器端库(OWASP Java Encoder、客户端DOMPurify等),而不是手动编码。

相关工具

最后更新:

看看 AI 提示词 →

直接插入页面,浏览器就会执行该脚本。如果正确编码输入——将 < 转换为 <,将 > 转换为 >——浏览器会将文本原样显示,而不是将其解析为标签。HTML实体编码是防御反射型和存储型XSS的主要手段。"}},{"@type":"Question","name":"为什么   不出现在此工具的列表中?","acceptedAnswer":{"@type":"Answer","text":"此工具对具有命名实体的字符进行编码。当您输入实际的不间断空格字符(在某些系统上可通过Alt+Space插入,或从字符映射表复制)时,不间断空格(Unicode U+00A0)将被编码为  。普通空格(U+0020,空格键)不会被编码,因为它是安全的ASCII字符。如果输出中特别需要  ,请在输入中键入或粘贴不间断空格字符。"}},{"@type":"Question","name":"可以用此工具防止用户输入中的HTML注入吗?","acceptedAnswer":{"@type":"Answer","text":"可以——在将用户提供的文本插入HTML之前对其进行编码,是防御HTML注入和XSS的核心手段之一。至少需要编码五个保留字符:&、<、>、\"、'。此工具对这五个字符全部进行编码。但是,仅靠编码并不是完整的安全解决方案:还需要适当的Content Security Policy标头、谨慎处理属性中的javascript: URL以及框架级保护措施。对于生产应用,请使用专为安全设计的服务器端库(OWASP Java Encoder、客户端DOMPurify等),而不是手动编码。"}}]},{"@context":"https://schema.org","@type":"HowTo","name":"HTML实体编码和解码在线工具","inLanguage":"zh-CN","step":[{"@type":"HowToStep","position":1,"name":"编码特殊字符","text":"选择编码模式,将文本粘贴到左侧框中。编码后的输出将显示在右侧。选择「命名」获得可读实体(&),选择「数字」获得通用十进制(&),选择「十六进制」获得十六进制(&)。勾选「编码所有非ASCII字符」可将每个非ASCII字符转换为实体。"},{"@type":"HowToStep","position":2,"name":"解码HTML实体","text":"选择解码模式,将含实体的HTML粘贴到左侧框中。工具可识别命名实体(&、©)、十进制数字实体(©)和十六进制实体(©),将它们全部转换回原始字符。"},{"@type":"HowToStep","position":3,"name":"互换编码与解码","text":"点击「互换」按钮可将输出移至输入并切换模式——便于验证往返转换或快速反转一次转换。"},{"@type":"HowToStep","position":4,"name":"复制结果","text":"点击「复制」将编码或解码结果放入剪贴板。"}]}]