咱们都知道url的形式中对于query子段是以?开始的key=value对,每一对之间以&分隔开。那么就有一个问题:若是在key=value对中的key或者value中含有'='或者'&',如:ke&y=value,则在url解析过程当中就会产生错误。
进一步的,不仅是query子段,在url前面的路径字段中,若是一个路径名中含有'/'或者'?'等字符会怎么样呢?为解决这类问题,就有了url编码问题。python
由RFC3986文档中规定,url中只容许使用大小写英文字母,阿拉伯数字和某些标点符号。更准确来讲只容许:函数
A-Z,a-z,0-9,-_.~四个特殊字符,也被称为非保留字符
以及! * ’ ( ) ; : @ & = + $ , / ? [ ] # 做为保留字符 编码
这里解释一下所谓保留字符和非保留字符的意义,保留字符是指url定义中容许使用的可能会被用做delimiter(分界符)的字符,因此保留下来;而非保留字符则是指在url定义中容许使用的没有保留目的的字符。url
因此非保留字符不是保留字符的补集,它只是url容许的字符中不是保留字符的部分!code
url中所使用的编码为:percent-encode,即百分号编码。这种编码形式十分简单,即便用%再加上字符所对应的两位十六进制数值,如:' '空格符对应的就是'%20'。文档
一开始对url进行规定时,只考虑了英文的状况,所用字符都限制在ASCII字符集中,即url是ASCII编码的。那么对于其它语言如中文,日文等,该如何进行处理呢?字符串
RCF3629中建议对这些ASCII字符集之外的字符先进行UTF-8编码,而后再把对应的UTF-8编码写为percent-encode的形式。it
再结合python的urllib包,易知在urllib.parse模块中的quote与urlencode函数中都有对字符串进行percent-encode,而且还自动包含了对于非ASCII字符进行urf-8编码再percent-encode的行为。im