共计 920 个字符,预计需要花费 3 分钟才能阅读完成。
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 的行为。