當(dāng) URL 路徑,或者查詢參數(shù)中帶有中文、特殊字符的時候,就需要對 URL 進行編碼(采用十六進制編碼格式)。URL 編碼的原則是使用安全字符(即沒有特殊用途或者特殊意義的字符)去表示那些不安全的字符。
為什么需要URL編碼
URL 之所以需要編碼,是因為 URL 中的某些字符會引起歧義,比如若 URL 查詢參數(shù)中包含”&”或者”%”就會造成服務(wù)器解析錯誤,再比如,URL 的編碼格式采用的是 ASCII 碼而非 Unicode,這表明 URL 中不允許包含任何非 ASCII 字符(比如中文),否則就會造成 URL 解析錯誤。
URL基本組成
一個 URL 的基本組件包括協(xié)議、域名、端口號、路徑和查詢字符串,其中路徑和查詢字符串之間使用問號?隔離,示例如下:
http://www.biancheng.net/index?param=10
其中域名為 http://www.biancheng.net,路徑為 index,查詢字符串為 param=1。
URL 中規(guī)定了一些字符(:/ ? # [ ] @)用來分隔不同的 URL 組件,這些字符被稱為保留字符。例如:
- 冒號:用于分隔協(xié)議和主機組件,斜杠用于分隔主機和路徑
- 問號:用于分隔路徑和查詢參數(shù)等。
還有一些保留字符(! $ & * + , ; =)起到分割 URL 不同組件的作用,比如:
-
=用于表示查詢參數(shù)中的鍵值對 -
&符號用于分隔查詢多個鍵值對。
哪些字符需要編碼
URL 編碼協(xié)議規(guī)定(即 RFC3986 協(xié)議):URL 中只允許包含英文字母、數(shù)字、以及這 4 個 - _ . ~ 特殊字符和所有的保留字符。協(xié)議中規(guī)定了以下保留字符:
! * ’ ( ) ; : @ & = + $ , / ? # [ ]
但是當(dāng)組件中的普通數(shù)據(jù)包含這些特殊字符時,它們就變成了不安全字符,此時就需要對其進行編碼處理。比如查詢字符串中包含了特殊字符:
http://www.biancheng.net/index?param=10*¶m1=20*
下表列出了一些 URL 特殊字符及其編碼:
為了讓您思路更清晰,下面簡單總結(jié)一下,哪些字符需要編碼。主要分為以下三種情況:
- ASCII 表中沒有對應(yīng)可顯示字符的,例如漢字。
- 不安全字符,包括:# ”% <> [] {} | \ ^ ` ~ 。
- 不當(dāng)做保留字符來使用的保留字符,即& / : ; = ? @ 。
URL在線編碼解碼
通過瀏覽器可以搜索到許多在線 URL 編碼解碼工具,比如編碼轉(zhuǎn)換工具(點擊訪問),這些工具能夠很方便的實現(xiàn) URL 的編碼與解碼。示例如下:
編碼前: http://www.biancheng.net/s?ie=utf-8&f=8&tn=baidu&wd=hell 編程幫
編碼后: http://www.biancheng.net/s?ie=utf-8&f=8&tn=baidu&wd=hell%20%B1%E0%B3%CC%B0
在我們編寫爬蟲程序的過程中,需要處理各式各樣的 URL,因此學(xué)習(xí)本節(jié)內(nèi)容有助于您掌握處理 URL 的知識。