注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云淡风轻

云淡风轻近午天,傍花随柳过前川。

 
 
 

日志

 
 

[javascript]escape, encodeURI, encodeURIComponent区别  

2009-02-08 22:58:05|  分类: 格物致知 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

这几个函数都是js里用来编码非ascii字符,以便于网络传输。根据RFC2396,URL(规范地说应该是URI,URI,URL和URN的区别在RFC2396里也有详细说明) 只允许下列字符:
2.2. Reserved Characters
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
"$" | ","
The "reserved" syntax class above refers to those characters that are
allowed within a URI, but which may not be allowed within a
particular component of the generic URI syntax; they are used as
delimiters of the components described in Section 3.
2.3. Unreserved Characters
Data characters that are allowed in a URI but do not have a reserved
purpose are called unreserved. These include upper and lower case
letters, decimal digits, and a limited set of punctuation marks and
symbols.
unreserved = alphanum | mark
mark = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"

除上面列出的两类字符外的其他字符,要想在URI里出现,就必须经过编码。保留字符(Reserved)和非保留(Unreserved)区别是:前者在 URI 里是有特殊含义的;后者并没有,只是可以在URI里出现,如果对它进行编码,得到的是一样的URI。想当然地认为,只要http服务器支持,任意的编码解码方式都是可以的。不过RFC2396里也规定了一个编码解码方式。
2.4.1. Escaped Encoding
An escaped octet is encoded as a character triplet, consisting of the
percent character "%" followed by the two hexadecimal digits
representing the octet code. For example, "%20" is the escaped
encoding for the US-ASCII space character.
escaped = "%" hex hex
hex = digit | "A" | "B" | "C" | "D" | "E" | "F" |
"a" | "b" | "c" | "d" | "e" | "f"
其实就是最简单的,把一个字节(8bit)用三个字符来表示,事实上就是16进制值了。叫做octet。

废话说了这么多,现在进入正题。这三个函数的目的,就是用来构造符合标准的URI。
但是这三个函数做的事情是不一样的。
escape: 这个函数看起来似乎有点奇怪。
  • 对于字母和数字,保持原样。
  • 对于上面的保留和非保留字符,有的编码了,有的没有。escape(";/?:@&=+$,-_.!~*'()") --> "%3B/%3F%3A@%26%3D+%24%2C-_.%21%7E*%27%28%29"
  • 对于unicode 128-255之间的字符,是按照上面的octet来编码的,比如:escape("ê") --> %EA
  • 对于大于255的,是编码成 %u + unicode值。比如:escape("我") -> %u6211
  这个函数现在已经是不推荐使用的了。原先设计的目的是用于服务端javascript,用于编码URL中的名值对。在客户端构造URI时,推荐使用另外两个函数。
encodeURI: 这个是用于编码整个URI的。一般用得非常少。
encodeURIComponent: 这个是用于编码URI的一个Component的,一个Component是指URI里被保留字符隔开的一部分。
上面两个函数,把非ascii字符按照UTF-8编码,编码成上面说的octet形式。区别在于,前一个不会对保留字符编码,后一个会对保留字符编码。字母,数字,非保留字符,两者都不会对之编码。
encodeURI(";/?:@&=+$,-_.!~*'()")
>>> ";/?:@&=+$,-_.!~*'()"
encodeURIComponent(";/?:@&=+$,-_.!~*'()")
>>>  "%3B%2F%3F%3A%40%26%3D%2B%24%2C-_.!~*'()"
>>> encodeURI('我')
"%E6%88%91"
>>> encodeURIComponent('我')
"%E6%88%91"
如果客户端发送的数据是用escape编码的,客户端需要自己解释成unicode并编码成某种编码方式,比如gb2312。
比如python:
q = cgi.FieldStorage()['q'].value  # 得到 %u6211
q = unichr(int(q[2:], 16)).encode('gb2312') # 得到“我”的gb编码的字符串

另外,在js里,对应的解码函数分别是:unescape, decodeURI, decodeURIComponent

口水完
=======================
参考: MDC
http://www.faqs.org/rfcs/rfc2396.html
  评论这张
 
阅读(519)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017