咱們都知道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