URL中,哪些字符需要编码?

关于URL编码,RFC1738做了如下的规定:

“Only alphanumerics [0-9a-zA-Z], the special characters “$-_.+!*’(),” [not including the quotes - ed], and reserved characters used for their reserved purposes may be used unencoded within a URL.”

RFC继而说明了保留字、特殊符号、不安全字符的含义——也就是说,下面三类字符可以不经过编码,直接出现在URL上:

  • [0-9a-zA-Z]
  • 特殊字符:$-_.+!*’(),
  • 保留字符:&/:;=?@

为了让我们思路更清晰,我们再总结一下,哪些字符必须要编码:

  • ASCII表中没有对应可显示字符的,例如汉字
  • 不安全字符,包括:#”%<>[]{}|\^`~
  • 不当做保留字符来使用的保留字符,即&/:;=?@

详见这张图,一目了然(点击看大图):

URL编码在ASCII表中的体现

URL编码在ASCII表中的体现

如何编码?

众所周知,字符是可由八位字节数(octet)来表示的,八位字节数可用十六进制来表示它的值。如字符“<”的八位字节数十六进制值是3C。在URL中,字符的编码方式为:“%”加上字符的两个十六进制数值。举几个例子:

  • “<”可以被编码为%3C,空格“SP”可被编码为“%20”
  • “田”的GB2312编码十六进制值是CC EF,这时“田”的URL编码为%CC%EF
  • “囧”的GBK编码十六进制值是87 E5,这时“囧”的URL编码为%87%E5
  • “田”的UTF-8编码十六进制值是E7 94 B0,这时“田”的URL编码为%E7%94%B0
URL中包含汉字时的更多话题

RFC1738没有规定汉字的编码方式,而是让浏览器自己去决定,因此造成了URL汉字编码的不统一。经过研究,对于URL中的“查询字符串”和“路径”中包含汉字,不同浏览器有不同的处理。

1. 查询字符串中包含汉字

在网址输入:http://www.baidu.com/s?wd=田囧 ,敲击回车,使用Fiddler观察浏览器发出的请求(以IE8和Firefox为例):

查询字符串中含有中文

查询字符串中含有中文

IE8将汉字作为GBK编码,直接发往服务器(这其实是不符合RFC规范的);Firefox则多了一次加%的操作。Windows操作系统是GBK编码。得到结论,地址栏直接访问URL,汉字作为查询字符串(Query string)时,IE和Firefox会使用系统编码发至服务器端,Firefox会按规矩编码。

注意1:不要用Google进行测试,Google的搜索URL(类似:http://www.google.com/#hl=en&source=hp&q=田囧 ),搜索关键词那里不是查询字符串,因为前面有个#……我开始没注意到,被搞迷茫了很久……

注意2:这只是对URL直接访问的规律。如果页面时从链接点击打开的,例如从A页面含中文的链接打开了B页面,那么浏览器对中文的编码取决于A页面的编码。

2. URL路径中包含汉字

在网址直接输入:http://www.hudong.com/wiki/田囧 ,敲击回车,观察请求:

路径中含有中文

路径中含有中文

IE8和Firefox都把汉字作为UTF8,按规范进行了URL编码,还好。

总结

什么字符应该编码,什么字符不用编码,URL编码的基本问题,到此已经解决啦。


来源 :http://hi.baidu.com/wely_ton/item/f138b1209787201108750884

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值