根據RFC3986中提到URI有些保留字(Reserved Characters),目的是為了避免和原本URI的通用語法(generic syntax)衝突,一旦出現這種情況,必須先使用百分比編碼(Percent-Encoding)將衝突的資料編碼之後再產生URI。
百分比編碼方式如:%HEXDIG HEXDIG
。
舉個例子,%20
,代表空白字元,為什麼? 其實這邊的空白字元為ASCII中的00100000,以10進制來看為32,以16進制來看為20。
以這個例子來看
GET /index.php?q=news&act=info&id=90324&subtitle=%5B%E6%9B%B8%E6%91%98%5D%20%E4%B8%83%E6%8B%9B%E8%82%8C%E5%8A%9B%E8%A8%93%E7%B7%B4%20%E6%B8%9B%E8%BC%95%E8%86%9D%E8%93%8B%E8%B2%A0%E6%93%94 HTTP/1.1
Host: tw.running.biji.co
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Referer: https://www.google.com.tw/
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-TW,zh;q=0.8,en-US;q=0.6,en;q=0.4,pt;q=0.2
Cookie: biji_user=twrunningbijico_583af606961741.86331768; __auc=ff8a4d4e1546fbf612fce2f73fa; _ga=GA1.2.439080984.1462163694
其中找物品的條件(query string)內的subtitle看起來很像亂碼,其實%5B是ASCII的[
,%5D是ASCII的]
,至於在中間的是中文字,%E6%9B%B8是書,%E6%91%98是摘,由此可知瀏覽器實際發送Request中的URL會利用百分比編碼幫你先做處理。