一个 “&” 符号引发的页面崩溃:你真的会用 HTML 转义吗?

121 阅读10分钟

一、为什么需要转义字符串

在 HTML 和 JavaScript 中,部分字符具有特殊功能(如 HTML 的< >用于定义标签,JavaScript 的\用于转义),无法直接作为文本显示;同时,ASCII 字符集中未定义的特殊字符(如版权符号 ©、希腊字母 α)也需通过转义形式呈现。转义字符串(也称字符实体)的核心作用就是解决这两个问题,确保特殊字符能被浏览器或脚本正确解析并显示。

二、转义字符串的组成规则

HTML 转义字符串(字符实体)统一由三部分构成:

  1. 起始符号:&(英文 ampersand)

  2. 核心标识:两种形式可选

  • 实体名称:如lt(对应 “less than”,即小于号<

  • 实体编号:# + 字符的 ASCII/Unicode 编码,如#60(对应小于号<

  1. 结束符号:;(分号,不可省略)

示例:显示小于号<,可使用&lt;(实体名称)或&#60;(实体编号)。

实体名称与实体编号的对比

对比维度实体名称实体编号
优势语义清晰、便于记忆(如&copy;直观对应版权符号)兼容性强,所有浏览器均支持
劣势部分老旧浏览器不支持最新实体名称编码无语义,难以记忆
注意事项严格区分大小写(如&Alpha;对应大写希腊字母 Α,&alpha;对应小写 α)编码需准确匹配字符的 ASCII/Unicode 值

三、HTML 特殊转义字符表

1. 最常用字符实体

显示效果说明实体名称实体编号
(半角空白)半方大的空白&ensp;&#8194;
(全角空白)全方大的空白&emsp;&#8195;
(非换行空白)不断行的空白格(解决 HTML 自动合并空格问题)&nbsp;&#160;
<小于号&lt;&#60;
>大于号&gt;&#62;
&& 符号&amp;&#38;
"双引号&quot;&#34;
©版权符号&copy;&#169;
®已注册商标符号&reg;&#174;
美国商标符号&trade;&#8482;
×乘号&times;&#215;
÷除号&divide;&#247;

2. ISO 8859-1(Latin-1)字符集

HTML 4.01 默认支持 ISO 8859-1 字符集,涵盖西欧语言字符、常用符号等,以下为完整对照表(“实体名称” 简称为 “名称”,“实体编号” 简称为 “编号”):

显示名称编号显示名称编号显示名称编号显示名称编号显示名称编号
(空白)&nbsp;&#160;¡&iexcl;&#161;¢&cent;&#162;£&pound;&#163;¤&curren;&#164;
¥&yen;&#165;¦&brvbar;&#166;§&sect;&#167;¨&uml;&#168;©&copy;&#169;
ª&ordf;&#170;«&laquo;&#171;¬&not;&#172;­&shy;&#173;®&reg;&#174;
¯&macr;&#175;°&deg;&#176;±&plusmn;&#177;²&sup2;&#178;³&sup3;&#179;
´&acute;&#180;µ&micro;&#181;&para;&#182;·&middot;&#183;¸&cedil;&#184;
¹&sup1;&#185;º&ordm;&#186;»&raquo;&#187;¼&frac14;&#188;½&frac12;&#189;
¾&frac34;&#190;¿&iquest;&#191;À&Agrave;&#192;Á&Aacute;&#193;Â&Acirc;&#194;
Ã&Atilde;&#195;Ä&Auml;&#196;Å&Aring;&#197;Æ&AElig;&#198;Ç&Ccedil;&#199;
È&Egrave;&#200;É&Eacute;&#201;Ê&Ecirc;&#202;Ë&Euml;&#203;Ì&Igrave;&#204;
Í&Iacute;&#205;Î&Icirc;&#206;Ï&Iuml;&#207;Ð&ETH;&#208;Ñ&Ntilde;&#209;
Ò&Ograve;&#210;Ó&Oacute;&#211;Ô&Ocirc;&#212;Õ&Otilde;&#213;Ö&Ouml;&#214;
×&times;&#215;Ø&Oslash;&#216;Ù&Ugrave;&#217;Ú&Uacute;&#218;Û&Ucirc;&#219;
Ü&Uuml;&#220;Ý&Yacute;&#221;Þ&THORN;&#222;ß&szlig;&#223;à&agrave;&#224;
á&aacute;&#225;â&acirc;&#226;ã&atilde;&#227;ä&auml;&#228;å&aring;&#229;
æ&aelig;&#230;ç&ccedil;&#231;è&egrave;&#232;é&eacute;&#233;ê&ecirc;&#234;
ë&euml;&#235;ì&igrave;&#236;í&iacute;&#237;î&icirc;&#238;ï&iuml;&#239;
ð&eth;&#240;ñ&ntilde;&#241;ò&ograve;&#242;ó&oacute;&#243;ô&ocirc;&#244;
õ&otilde;&#245;ö&ouml;&#246;÷&divide;&#247;ø&oslash;&#248;ù&ugrave;&#249;
ú&uacute;&#250;û&ucirc;&#251;ü&uuml;&#252;ý&yacute;&#253;þ&thorn;&#254;
ÿ&yuml;&#255;------------

3. 数学符号与希腊字母

显示名称编号显示名称编号显示名称编号显示名称编号显示名称编号
ƒ&fnof;&#402;Α&Alpha;&#913;Β&Beta;&#914;Γ&Gamma;&#915;Δ&Delta;&#916;
Ε&Epsilon;&#917;Ζ&Zeta;&#918;Η&Eta;&#919;Θ&Theta;&#920;Ι&Iota;&#921;
Κ&Kappa;&#922;Λ&Lambda;&#923;Μ&Mu;&#924;Ν&Nu;&#925;Ξ&Xi;&#926;
Ο&Omicron;&#927;Π&Pi;&#928;Ρ&Rho;&#929;Σ&Sigma;&#931;Τ&Tau;&#932;
Υ&Upsilon;&#933;Φ&Phi;&#934;Χ&Chi;&#935;Ψ&Psi;&#936;Ω&Omega;&#937;
α&alpha;&#945;β&beta;&#946;γ&gamma;&#947;δ&delta;&#948;ε&epsilon;&#949;
ζ&zeta;&#950;η&eta;&#951;θ&theta;&#952;ι&iota;&#953;κ&kappa;&#954;
λ&lambda;&#955;μ&mu;&#956;ν&nu;&#957;ξ&xi;&#958;ο&omicron;&#959;
π&pi;&#960;ρ&rho;&#961;ς&sigmaf;&#962;σ&sigma;&#963;τ&tau;&#964;
υ&upsilon;&#965;φ&phi;&#966;χ&chi;&#967;ψ&psi;&#968;ω&omega;&#969;
ϑ&thetasym;&#977;Υ&upsih;&#978;ϖ&piv;&#982;&bull;&#8226;&hellip;&#8230;
&prime;&#8242;&Prime;&#8243;&oline;&#8254;&frasl;&#8260;&weierp;&#8472;
&image;&#8465;&real;&#8476;&trade;&#8482;&alefsym;&#8501;&larr;&#8592;
&uarr;&#8593;&rarr;&#8594;&darr;&#8595;&harr;&#8596;&crarr;&#8629;
&lArr;&#8656;&uArr;&#8657;&rArr;&#8658;&dArr;&#8659;&hArr;&#8660;
&forall;&#8704;&part;&#8706;&exist;&#8707;&empty;&#8709;&nabla;&#8711;
&isin;&#8712;&notin;&#8713;&ni;&#8715;&prod;&#8719;&sum;&#8721;
&minus;&#8722;&lowast;&#8727;&radic;&#8730;&prop;&#8733;&infin;&#8734;
&ang;&#8736;&and;&#8743;&or;&#8744;&cap;&#8745;&cup;&#8746;
&int;&#8747;&there4;&#8756;&sim;&#8764;&cong;&#8773;&asymp;&#8776;
&ne;&#8800;&equiv;&#8801;&le;&#8804;&ge;&#8805;&sub;&#8834;
&sup;&#8835;&nsub;&#8836;&sube;&#8838;&supe;&#8839;&oplus;&#8853;
&otimes;&#8855;&perp;&#8869;&sdot;&#8901;&lceil;&#8968;&rceil;&#8969;
&lfloor;&#8970;&rfloor;&#8971;&lang;&#9001;&rang;&#9002;&loz;&#9674;
&spades;&#9824;&clubs;&#9827;&hearts;&#9829;&diams;&#9830;---

4. 重要国际标记

显示名称编号显示名称编号显示名称编号显示名称编号显示名称编号
"&quot;&#34;&&amp;&#38;<&lt;&#60;>&gt;&#62;Œ&OElig;&#338;
œ&oelig;&#339;Š&Scaron;&#352;š&scaron;&#353;Ÿ&Yuml;&#376;ˆ&circ;&#710;
˜&tilde;&#732;(半角空白)&ensp;&#8194;(全角空白)&emsp;&#8195;(窄空白)&thinsp;&#8201;&zwnj;&#8204;
&zwj;&#8205;&lrm;&#8206;&rlm;&#8207;&ndash;&#8211;&mdash;&#8212;
&lsquo;&#8216;&rsquo;&#8217;&sbquo;&#8218;&ldquo;&#8220;&rdquo;&#8221;
&bdquo;&#8222;&dagger;&#8224;&Dagger;&#8225;&permil;&#8240;&lsaquo;&#8249;
&rsaquo;&#8250;&euro;&#8364;---------

四、JavaScript 转义符

JavaScript 中,转义符以\(反斜杠)开头,用于表示特殊控制字符或避免语法冲突,常见转义序列如下:

转义序列对应字符说明
\b退格符使光标向左移动一位
\f走纸换页符用于打印机换页
\n换行符光标移至下一行开头
\r回车符光标移至当前行开头
\t横向跳格符(Tab)光标向右跳格(等同于 Ctrl+I)
\'单引号避免与字符串外层单引号冲突(如'He said \'Hello\'!'
\"双引号避免与字符串外层双引号冲突(如"She said \"Hi\"!"
\\反斜杠表示一个真实的反斜杠(因\本身为转义符,需双重转义)

注意:若需在 JavaScript 中直接使用反斜杠(如文件路径),必须书写为\\(双重反斜杠),否则会被解析为转义符。

五、编码转换工具(转 Unicode/HTML 实体)

以下为不同编程语言中,实现 “普通字符→Unicode/HTML 实体” 或 “反向转换” 的代码示例(代码来源于网络):

1. JavaScript 版(字符转 Unicode)

\<script>

&#x20;   var test = "你好abc"; // 待转换的字符串

&#x20;   var str = "";

&#x20;   for (var i = 0; i < test.length; i++) {

&#x20;       var temp = test.charCodeAt(i).toString(16); // 将字符转为16进制Unicode编码

&#x20;       // 补零至4位,拼接为\uXXXX格式

&#x20;       str += "\\\u" + new Array(5 - String(temp).length).join("0") + temp;

&#x20;   }

&#x20;   document.write(str); // 输出:\u4f60\u597d\u0061\u0062\u0063

\</script>

2. VBScript 版(字符转 Unicode/HTML 实体)

(1)字符转 Unicode

Function Unicode(str1)

&#x20;   Dim str, temp

&#x20;   str = ""

&#x20;   For i = 1 To Len(str1)

&#x20;       temp = Hex(AscW(Mid(str1, i, 1))) // 转为16进制Unicode编码

&#x20;       If Len(temp) < 5 Then temp = Right("0000" & temp, 4) // 补零至4位

&#x20;       str = str & "\u" & temp

&#x20;   Next

&#x20;   Unicode = str

End Function

(2)字符转 HTML 实体

Function htmlentities(str)

&#x20;   For i = 1 To Len(str)

&#x20;       char = Mid(str, i, 1)

&#x20;       If AscW(char) > 128 Then

&#x20;           // 非ASCII字符转为\&#XXX;格式

&#x20;           htmlentities = htmlentities & "\&#" & AscW(char) & ";"

&#x20;       Else

&#x20;           // ASCII字符直接保留

&#x20;           htmlentities = htmlentities & char

&#x20;       End If

&#x20;   Next

End Function

3. ColdFusion 版(字符转 HTML 实体)

function nochaoscode(str)

{

&#x20;   var new\_str = "";

&#x20;   for(i=1; i lte len(str); i=i+1){

&#x20;       if(asc(mid(str,i,1)) lt 128){

&#x20;           // ASCII字符直接保留

&#x20;           new\_str = new\_str & mid(str,i,1);

&#x20;       }else{

&#x20;           // 非ASCII字符转为\&#XXX;格式

&#x20;           new\_str = new\_str & "\&#" & asc(mid(str,i,1)) & ";";

&#x20;       }

&#x20;   }

&#x20;   return new\_str;

}

4. PHP 版(字符与 HTML 实体互转)

PHP 可通过mbstring扩展的mb_convert_encoding函数实现双向转换,无需手动循环。

(1)普通字符→HTML 实体

// 将“你好”从GB2312编码转为HTML实体

echo mb\_convert\_encoding("你好", "HTML-ENTITIES", "gb2312");&#x20;

// 输出:\&#20320;\&#22909;

(2)HTML 实体→普通字符

// 将HTML实体“\&#20320;\&#22909;”转回GB2312编码的“你好”

echo mb\_convert\_encoding("\&#20320;\&#22909;", "gb2312", "HTML-ENTITIES");&#x20;

// 输出:你好

(3)整页 HTML 实体转换

若需将整个 PHP 页面的输出转为 HTML 实体,在文件头部添加以下代码:

// 1. 设置页面原始编码(根据网站实际编码调整,如UTF-8)

mb\_internal\_encoding("gb2312");&#x20;

// 2. 设置HTTP输出编码为HTML-ENTITIES

mb\_http\_output("HTML-ENTITIES");&#x20;

// 3. 启用输出缓冲,自动转换编码

ob\_start('mb\_output\_handler');

六、注意事项

  1. HTML 空格处理:HTML 会自动合并多个连续空格为 1 个,若需显示多个空格,需使用&nbsp;(非换行空格)、&ensp;(半角空格)或&emsp;(全角空格)。

  2. 实体名称大小写:HTML 实体名称严格区分大小写,如&Copy;(首字母大写)无法识别,必须写为&copy;(全小写)。

  3. JavaScript 反斜杠:永远不要直接使用单个\,需用\\表示真实反斜杠,避免被解析为转义符导致错误。

  4. 编码兼容性:若网站使用 UTF-8 编码,部分非 ASCII 字符(如中文)可直接显示,但为兼容老旧浏览器,建议转为 HTML 实体(&#XXX;)。


来源:本文整理自 HTML 转义字符 | 西西软件资讯