URL编码问题

url编码原因

我们都知道url的形式中对于query子段是以?开始的key=value对,每一对之间以&分隔开。那么就有一个问题:如果在key=value对中的key或者value中含有'='或者'&',如:ke&y=value,则在url解析过程中就会产生错误。
进一步的,不只是query子段,在url前面的路径字段中,如果一个路径名中含有'/'或者'?'等字符会怎么样呢?为解决这类问题,就有了url编码问题。

url编码

由RFC3986文档中规定,url中只允许使用大小写英文字母,阿拉伯数字和某些标点符号。更准确来说只允许:

A-Z,a-z,0-9,-_.~四个特殊字符,也被称为非保留字符
以及! * ’ ( ) ; : @ & = + $ , / ? [ ] # 作为保留字符

这里解释一下所谓保留字符和非保留字符的意义,保留字符是指url定义中允许使用的可能会被用作delimiter(分界符)的字符,所以保留下来;而非保留字符则是指在url定义中允许使用的没有保留目的的字符。

所以非保留字符不是保留字符的补集,它只是url允许的字符中不是保留字符的部分!

编码规则

url中所使用的编码为:percent-encode,即百分号编码。这种编码形式十分简单,即使用%再加上字符所对应的两位十六进制数值,如:' '空格符对应的就是'%20'。

  1. 那么非保留字符和保留字符以外的字符(即ASCII码集中除两者以外的字符),如果使用在url中,就需要进行百分号编码。
  2. 保留字符使用在delimiter以外的场合也要进行百分号编码。

补充

一开始对url进行规定时,只考虑了英文的情况,所用字符都限制在ASCII字符集中,即url是ASCII编码的。那么对于其它语言如中文,日文等,该如何进行处理呢?

RCF3629中建议对这些ASCII字符集以外的字符先进行UTF-8编码,然后再把对应的UTF-8编码写为percent-encode的形式。

发散

再结合python的urllib包,易知在urllib.parse模块中的quote与urlencode函数中都有对字符串进行percent-encode,并且还自动包含了对于非ASCII字符进行urf-8编码再percent-encode的行为。

你可能感兴趣的:(网页爬虫,网络,url)