UltKit

HTML实体编码与解码

转义HTML会当作标记处理的字符,也可以选择转义所有非ASCII字符;或者把 é、— 这类实体还原为纯文本。编码和解码都在浏览器中完成,解码后的内容绝不会作为可执行的HTML渲染。

模式
实体样式
转义范围

0 个字符 · 0 个词 · 0 行

0 个字符 · 0 个词 · 0 行

完全在当前浏览器标签页中运行,您的文本不会被上传或保存。

常见字符及其实体

命名、十进制和十六进制形式解码后都是同一个字符。编码器支持 216 个常用命名实体;解码器能识别 HTML 标准中的所有命名引用。

字符命名十进制十六进制
&&&&
<&lt;&#60;&#x3C;
>&gt;&#62;&#x3E;
"&quot;&#34;&#x22;
'&apos;&#39;&#x27;
(不换行空格)&nbsp;&#160;&#xA0;
©&copy;&#169;&#xA9;
®&reg;&#174;&#xAE;
™&trade;&#8482;&#x2122;
€&euro;&#8364;&#x20AC;
£&pound;&#163;&#xA3;
¥&yen;&#165;&#xA5;
—&mdash;&#8212;&#x2014;
–&ndash;&#8211;&#x2013;
…&hellip;&#8230;&#x2026;
«&laquo;&#171;&#xAB;
»&raquo;&#187;&#xBB;
°&deg;&#176;&#xB0;
×&times;&#215;&#xD7;
÷&divide;&#247;&#xF7;
é&eacute;&#233;&#xE9;
π&pi;&#960;&#x3C0;
→&rarr;&#8594;&#x2192;
😀—&#128512;&#x1F600;

从HTML 4的252个实体到HTML5的2,231个

字符引用是只用 ASCII 字符来书写任意字符的方式。数字引用适用于任何 Unicode 码位,可以用十进制(&#233;)或十六进制(&#xE9;)表示。命名引用更容易记忆:HTML 4 定义了 252 个,涵盖 &eacute; 等 Latin-1 字母、希腊字母、数学符号,以及 &mdash;、&hellip; 这类排版符号。有意思的是,&apos; 并不在其中;它来自 XML,直到 HTML5 才成为有效的 HTML。

HTML5 把命名字符引用扩充到 2,231 个,并吸收了 MathML 的实体集,因此 &check;、&bigstar;、&NotEqualTilde; 这样的名称现在在所有主流浏览器中都能使用。这个数量包含不带结尾分号的旧式写法,例如 &amp 和 &copy,解析器出于兼容仍会接受,但你不应该这样写。这里的编码器输出兼容性广泛的 HTML 4 名称外加 &apos;,其余字符回退为数字引用;解码器则把文本交给浏览器自带的解析器处理,因此能识别全部 2,231 个名称。

哪些字符需要转义,以及仅靠转义不够的情况

仅 & < > " ' 适合日常使用:它会转义可能结束文本节点或带引号属性的五个字符,足以在页面上展示代码示例,或把用户输入的文本安全地放进 HTML。同时转义所有非 ASCII 字符会把 é、€ 和 emoji 也转成引用,适用于少数无法传输 UTF-8 的场景,例如某些老式邮件模板或会破坏编码的系统。命名、十进制和十六进制只改变引用的写法,三者解码后得到的是同一个字符。以 UTF-8 保存的页面,带重音的字母不需要使用实体。

转义只保护 HTML 上下文,其他场景无效。插入 script 块、onclick 之类的内联事件处理器、style 属性,或可能以 javascript: 开头的 href 中的文本,需要另外的处理方式,仅靠实体编码无法防止这些位置的跨站脚本攻击。React 等框架默认会转义文本,所以在现代应用中更常见的错误是重复转义:用户在本该显示 & 的地方看到了 &amp;。如果想彻底去掉标签,请用 HTML转TXT 转换标记;如需转义 URL 中的内容,请使用 URL编码与解码。

常见问题

HTML中哪些字符必须转义?
在文本中,& 和 < 是必须转义的,> 按惯例也会转义。在属性值内,还要转义用来包围它的引号字符。五个字符全部转义即可覆盖这两种情况。
&nbsp; 和普通空格有什么区别?
&nbsp; 是不换行空格,即 U+00A0。它看起来像空格,但会阻止在该处换行,而且与 HTML 中普通空格不同,连续出现多个时不会被合并。
为什么页面上显示的是 &amp; 而不是 & 符号?
文本被转义了两次:一次在你的数据中,另一次由模板或框架完成。请保存原始文本,只让一层(通常是模板)在输出时负责转义。
在这里解码来源不可信的HTML安全吗?
可以。解码器把输入当作纯文本内容解析,因此不会生成标签、不会运行脚本,也不会加载图片,只会把实体引用转换成字符。
命名实体和数字实体哪个更好?
命名引用更易读,数字引用适用于所有字符,并且在所有 XML 解析器中都有效。在没有 DTD 的 XML 中,只有 &amp;、&lt;、&gt;、&quot; 和 &apos; 是预定义的。