URL编码

1 什么是URL

统一资源定位符(URL,英语 Uniform / Universal Resource Locator 的缩写)也被称为网页地址,是因特网上标准的资源的地址(Address)。现在它已经被万维网联盟编制为因特网标准RFC1738。

统一资源定位符(URL)是用于完整地描述Internet上网页和其他资源的地址的一种标识方法。

Internet上的每一个网页都具有一个唯一的名称标识,通常称之为URL地址,这种地址可以是本地磁盘,也可以是局域网上的某一台计算机,更多的是Internet上的站点。简单地说,URL就是Web地址,俗称“网址”。

2 URL编码

URL编码是一个专门对地址栏里所传递的参数进行编码的规则。  
比如在参数中带有空格的话,传递参数时就会发生错误,而用URL编码过以后,空格变成了%20这样就不会发生错误了;  另外中文字经编码后全是怪符号,有利于保密。这个编码后的字串提交给服务器后是不需要解码的,网页会自动识别。

url编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值,将它们以name/value参数编码(移去那些不能传送的字符, 将数据排行等等)作为URL的一部分或者分离地发给服务器。不管哪种情况, 在服务器端的表单输入格式样子象这样:
theName=Ichabod+Crane&gender=male&status=missing&headless=yes

URL编码遵循下列规则:  
每对name/value由&符分开;每对来自表单的name/value由=符分开。  如果用户没有输入值给这个name,那么这个name还是出现,只是无值。  任何特殊的字符(就是那些不是简单的七位ASCII,如汉字)将以百分符%用十六进制编码,当然也包括象 =, &, 和 % 这些特殊的字符。  (其他字符呢?)

  • 字母数字字符 "a" 到 "z"、"A" 到 "Z" 和 "0" 到 "9" 保持不变。
  • 特殊字符 "."、"-"、"*" 和 "_" 保持不变。
  • 空格字符 " " 转换为一个加号 "+"。
  • 所有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为一个或多个字节。然后每个字节用一个包含 3 个字符的字符串 "%xy" 表示,其中 xy 为该字节的两位十六进制表示形式。推荐的编码机制是 UTF-8。但是,出于兼容性考虑,如果未指定一种编码,则使用相应平台的默认编码。

其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动,需要在前面加上“%”。比如“/”,它的ascii码是92,92的十六进制是5c,所以“/”的url编码就是%5c。由于不同系统对汉字的编码不同,同样的汉字也编码也不尽相同,比如“中国”在百度的编码是“%D6%D0%B9%FA”(与ASP的编码相同),而google的编码则是“%E4%B8%AD%E5%9B%BD”。

3 例子

GOOGLE用户经常有这样的感觉:

  1. 为什么我第一次去GOOGLE,出现的就是中文的界面?
  2. 为什么在所有网站中查中文:有时候还会匹配到日文网站的结果?比如:就以"google 秘密"这个查询为例:我们在输入框输入"google 秘密"
    http://www.google.com/search?hl=zh-CN&newwindow=1&q=google+%C3%D8%C3%DC&btnG=Google%CB%D1%CB%F7&lr=

首先我将GOOGLE对查询的处理流程简单的说明如下:

  1. 客户端浏览器输入;
  2. 查询字符串按客户端系统编码方式(GBK)转换成字节流,并URL Encode后传给GOOGLE;
  3. GOOLGE将输入的字符串URL Decode后,按照客户端的系统编码方式将这个字符串(字节串)解码成UniCode
  4. 查询过程,完全是基于UniCode的匹配过程,比如对于“中文”这2个字在简体繁体中文和日文里都有,因此无论是何种语言的页面包含这2个字的页面都能匹配上。
  5. 结果集输出:将查询结果集的内容(UNICODE)按客户端系统编码方式(GBK)“编码”成的字节流,返回给浏览器

具体说明:

  • GOOGLE如何识别出浏览器使用的“界面语言”:GOOGLE获得这个查询字符串的同时,一般会根据hl=zh-CN这个参数,知道了客户端使用的字符集编码方式,如果用户第一次访问:GOOGLE会根据浏览器的发送的请求中包含的Accept language: zh_cn这个头信息来判别,这就是为什么现在很多用户第一次去GOOGLE的时候它就能自动识别出来的原因。这个参数在之后的查询和翻页过程中通过 cookie保存,并通过get方式一直传递给GOOGLE(因此你也可以使用使用偏好设置界面语言),从而可靠地识别出客户端的编码方式。
  • GOOGLE如何查询:也许从URL上你可以看到:传过去的“秘密”这个查询实际上是%C3%D8%C3%DC=>"秘密"这2个字按GBK(WINDOWS客户端缺省的编码方式)编码方式的4个字节然后再URLEncode后的形式,GOOGLE 将查询字符串按这个编码方式解码并转成UniCode,然后用这个UniCode编码方式的字符串进行内部的查询操作。而任何语言的页面都是先转换成 UniCode后存储在GOOGLE的数据索引库里的。在UniCode中日文和中文写法一样的字,用的是同样的编码。因此,如果你没有指定语言过滤的话,日文网页的结果就首先被命中了;因此,对于中文客户端的查询:如果相应字符在UniCode中和繁体,日文映射的字一样,就可以匹配到相应的日文网页,繁体中文网页...,GOOGLE的查询结果也首先是UniCode的,最后将UniCode结果按照客户端的编码方式转换成字节流,返回到客户端。

从以上的分析中我们可以看出:UniCode非常漂亮的解决了应用的国际化问题。对于应用前端来说,剩下的工作就是根据本地编码环境进行本地化的过程了。

  1. 数据从输入的开始,就全部先转换成UniCode,然后再进行处理,并按照UniCode方式集中存储(UniCode inside)
  2. 数据输出过程中,只是在最后输出到客户端的时候,按照客户端的本地化设置将UniCode数据转换成本地字符集,并配以相应语言/字符的界面(Localization outside) 。

未完待续

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值