HTML实体编码和解码在线工具
粘贴文本以将特殊字符编码为HTML实体,或粘贴带实体的HTML以将其解码回可读文本。可在命名实体(&、<、©)、十进制数字(©)或十六进制(©)编码之间选择。还可选择对所有非ASCII字符进行编码以获得最大兼容性。
工作原理
什么是HTML实体?
HTML实体是用于表示在HTML中具有特殊含义或无法直接输入的字符的特殊文本代码。最重要的是HTML语法中保留的五个字符:&(与号)→ &、<(小于号)→ <、>(大于号)→ >、"(双引号)→ " 以及 '(单引号)→ '。如果这些字符在文本内容中未经编码出现,浏览器可能会将其解释为HTML标记,从而导致渲染错误或安全漏洞。
HTML实体有三种格式:命名实体使用描述性名称(© 表示 ©,€ 表示 €),十进制数字字符引用使用码点编号(© 表示 ©),十六进制字符引用使用十六进制代码(© 表示 ©)。三种格式完全等价——无论使用哪种格式,浏览器都会渲染相同的字符。命名实体可读性最强;数字实体最为通用,因为它适用于任何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实体(如 &)用于在HTML文档中安全地表示字符。URL编码(如 %26 表示 &)用于在查询字符串和URL中对具有特殊含义的字符进行编码。Base64将任意二进制数据编码为ASCII文本,用于数据URI和电子邮件附件。
常见错误是将它们混淆:对HTML内容使用URL编码,或对URL使用HTML编码。例如,URL查询字符串中的与号需要百分号编码(%26),而非HTML实体编码(&)。如果构建的URL随后嵌入HTML属性中,则两者都需要:URL编码的形式放入属性,属性值本身进行HTML编码。理解哪种编码适用于哪种上下文,可以防止双重编码错误和安全问题。
常见问题
›与号(&)的HTML实体是什么?
与号的HTML实体是 &——字面上由 &、a、m、p 和分号组成。在HTML源代码中写 & 时,浏览器会显示单个 & 字符。每当与号出现在文本内容或属性值中时,必须进行此编码,因为未编码的 & 会开始一个实体序列,解析器会尝试对其进行解释。
›版权符号(©)的HTML实体是什么?
版权符号 © 有三个等价的HTML实体:命名实体 ©、十进制数字实体 © 和十六进制实体 ©。三者都渲染相同的 © 字符。命名实体是最具可读性的选项。对于现代UTF-8 HTML,只要HTML文件声明了 charset=utf-8,也可以直接输入 © 字符,无需使用实体。
›在HTML中需要对引号进行编码吗?
在双引号分隔的HTML属性内,双引号(")必须编码为 ",例如:<input value=""">。在单引号分隔的属性内,单引号(')必须编码为 ' 或 '。在元素文本内容中(标签之间),两种引号都可以不编码出现,但编码也无妨。在所有上下文中一致地对两者进行编码是最安全的做法。
›命名实体和数字实体有什么区别?
命名实体使用描述性词语(©、€、♥),在HTML规范中定义——并非每个Unicode字符都有命名实体。数字实体使用Unicode码点,可以是十进制(€ 表示 €)或十六进制(€ 表示 €)。数字实体适用于任何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> 直接插入页面,浏览器就会执行该脚本。如果正确编码输入——将 < 转换为 <,将 > 转换为 >——浏览器会将文本原样显示,而不是将其解析为标签。HTML实体编码是防御反射型和存储型XSS的主要手段。
›为什么 不出现在此工具的列表中?
此工具对具有命名实体的字符进行编码。当您输入实际的不间断空格字符(在某些系统上可通过Alt+Space插入,或从字符映射表复制)时,不间断空格(Unicode U+00A0)将被编码为 。普通空格(U+0020,空格键)不会被编码,因为它是安全的ASCII字符。如果输出中特别需要 ,请在输入中键入或粘贴不间断空格字符。
›可以用此工具防止用户输入中的HTML注入吗?
可以——在将用户提供的文本插入HTML之前对其进行编码,是防御HTML注入和XSS的核心手段之一。至少需要编码五个保留字符:&、<、>、"、'。此工具对这五个字符全部进行编码。但是,仅靠编码并不是完整的安全解决方案:还需要适当的Content Security Policy标头、谨慎处理属性中的javascript: URL以及框架级保护措施。对于生产应用,请使用专为安全设计的服务器端库(OWASP Java Encoder、客户端DOMPurify等),而不是手动编码。
相关工具
最后更新: