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的行为。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。