转义和编码

一、HTML转义

转义字符串(Escape Sequence)也称字符实体(Character Entity)。在HTML中,定义转义字符串的原因有两个:第一个原因是像“<”和“>”这类符号已经用来表示HTML标签,因此就不能直接当作文本中的符号来使用。为了在HTML文档中使用这些符号,就需要定义它的转义字符串。当解释程序遇到这类字符串时就把它解释为真实的字符。在输入转 义字符串时,要严格遵守字母大小写的规则。第二个原因是,有些字符在ASCII字符集中没有定义,因此需要使用转义字符串来表示。

转义字符串(Escape Sequence),即字符实体(Character Entity)分成三部分:第一部分是一个&符号,英文叫ampersand;第二部分是实体(Entity)名字或者是#加上实体(Entity)编号;第三部分是一个分号。

比如,要显示小于号(<),就可以写 &lt; 或者 &#60; 。

用实体(Entity)名字的好处是比较好理解,一看lt,大概就猜出是less than的意思,但是其劣势在于并不是所有的浏览器都支持最新的Entity名字。而实体(Entity)编号,各种浏览器都能处理。

提示:实体名称(Entity)是区分大小写的。

备注:同一个符号,可以用“实体名称”和“实体编号”两种方式引用,“实体名称”的优势在于便于记忆,但不能保证所有的浏览器都能顺利识别它,而“实体编号”则没有这种担忧,但它实在不方便记忆。

最常用的字符实体 Character Entities

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

二、JavaScript编码

在JavaScrip中的字符串计算长度是以多少个文字,而不是多少个字节,即一个中文也只占一个长度。

//将字符串以unicode的编码输出
     test = "你好abc";
     str = "";
     for( i=0; i<test.length; i++ )
     {
      temp = test.charCodeAt(i).toString(16);
      str    += "\\u"+ new Array(5-String(temp).length).join("0") +temp;
     }
     document.write (str);
//求真正的字节长度
String.prototype.byteLength = function() {
     var totalLen = 0;
     var charCode;
     for(var i=0;i<this.length;i++) {
         charCode = this.charCodeAt(i);
         if(charCode < 0x007f) {
             totalLen += 1;
         } else if ((0x0080 <= charCode) && (charCode <= 0x07ff)) {
             totalLen += 2;
         } else if((0x0800 <= charCode) && (charCode <= 0xffff)) {
             totalLen += 3;
         }
     }
     return totalLen;
}

关于encodeURI()和encodeURIComponent():

encodeURI()和encodeURIComponent()方法用于编码传递给浏览器的URI(统一资源标识符)。有效的URI不能包含某些字符,如空格。这两个方法用于编码URI,这样用专门的UTF-8编码替换所有的非有效字符,就可以使浏览器仍能够接受并理解它们。

encodeURI()方法用于处理完整的URI(例如,http://www.wrox.com/illegal value.htm),而encodeURIComponent()用于处理URI的一个片断(如前面的URI中的illegal value.htm)。这两个方法的主要区别是encodeURI()方法不对URI中的特殊字符进行编码,如冒号、前斜杠、问号和英镑符号,而encodeURIComponent()则对它发现的所有非标准字符进行编码。例如:
image056
image057
可以看到,除空格外,第一个URI无任何改变,空格被替换为%20。第二个URI中的所有非字母数字字符都被替换成它们对应的编码,基本上使这个URI变得无用。这就是encodeURI()可以处理完整URI,而encodeURIComponent()只能处理附加在已有URI末尾的字符串的原因。

总的来说,传递参数时需要使用encodeURIComponent,这样组合的url才不会被#等特殊字符截断。进行url跳转时应该整体使用encodeURI,Location.href=encodeURI(“http://blog.endlesscode.com?tag=转义和编码”)。

关于escape、encodeURI、encodeURIComponent转义的字符区别:

函数 不变换字符
escape (69个) *+-./@_0-9a-zA-Z
encodeURI (82个) !#$&’()*+,-./:;=?@_~ 0-9a-zA-Z
encodeURIComponent (71个) !’()*-._~0-9a-zA-Z

常见的字符编码:

字符 十六进制
+ %2B
空格 %20
/ %2F
? %3F
% %25
# %23
& %26
= %3D

引用:

This entry was posted in Web. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>