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'。
- 那么非保留字符和保留字符以外的字符(即ASCII码集中除两者以外的字符),如果应用在url中,就须要进行百分号编码。
- 保留字符应用在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的行为。