使用瀏覽器進行Http網絡請求時,若請求query中包含中文,中文會被編碼爲 %+16進制+16進制
形式,但你真的深刻了解過,爲何要進行這種轉義編碼嗎?編碼的原理又是什麼?html
例如,瀏覽器中進行百度搜索「你好」時,連接地址會被自動編碼:
(編碼前)https://www.baidu.com/s?wd=你好
(編碼後)https://www.baidu.com/s?wd=%E4%BD%A0%E5%A5%BD
出現以上狀況是網絡請求前,瀏覽器對請求URL進行了URL編碼(URL Encoding)
。瀏覽器
URL編碼(URL Encoding)
:也稱做百分號編碼(Percent Encoding)
, 是特定上下文的統一資源定位符 URL的編碼機制。URL編碼(URL Encoding)
也適用於統一資源標誌符(URI)
的編碼,一樣用於 application/x-www-form-urlencoded MIME
準備數據。安全
在URL的最初設計時,但願能夠經過書面轉錄,好比寫在餐巾紙上告訴另一人,所以URI的構成字符必須是可寫的ASCII字符。
中文不在ASCII字符中,所以中文出如今URL地址中時,須要進行編碼;同時可書寫的ASCII字符中,存在一些不安全字符
也須要轉碼,如空格
(空格容易被忽略,也容易意想不到的緣由引入)。網絡
編碼的原理
能夠表述爲:
將須要轉碼的字符,按指定編碼方式(默認使用UTF-8編碼)轉化爲字節流,每一個字節按16進製表示,並添加%組成一個percent編碼。
app
例如:漢字 「你好」
編碼
-28 -67 -96 -27 -91 -67
E4 BD A0 E5 A5 BD
%E4%BD%A0%E5%A5%BD
上文中提到須要轉碼的字符
,那麼哪些字符是須要轉碼的字符?
這裏涉及到兩個概念:Reserved(保留字符)
和Unreserved(非保留字符)
。url
Reserved(保留字符)
是那些具備特殊含義的字符,例如:"/"字符用於URL不一樣部分的分界符;Unreserved(非保留字符)
沒有特殊含義,包含希臘字母 / 數字 / "-" / "." / "_" / "~"
。回到剛纔的問題,哪些字符是須要轉碼的字符?設計
Reserved(保留字符)
和Unreserved(非保留字符)
以外的全部字符,均須要percent編碼;Reserved(保留字符)
也須要進行percent編碼:Reserved(保留字符)
不用於URL分隔符,而是用於其餘的位置,不表明某種特性的含義時,須要進行percent編碼。例如:保留字符用於URL請求query後面的value中時,要對此時用到的Reserved(保留字符)
作percent編碼;結論:code
空格
編碼爲+
的狀況:Content-Type:application/x-www-form-urlencoded
的狀況下,URL請求查詢字符串中出現空格
時,需替換爲+
。空格
編碼爲%20
;依據:orm
按照 rfc3986 標準,空格
在進行編碼時,編碼後對應爲%20
。
但根據W3C標準:,提交表單時請求時Content-Type:application/x-www-form-urlencoded
狀況下,URL請求查詢字符串中出現空格
時,需替換爲+
。
rfc3986:
https://tools.ietf.org/html/rfc3986
rfc1738:
https://www.ietf.org/rfc/rfc1738.txt
W3C標準:
https://www.w3.org/TR/html4/interact/forms.html#h-17.13.4.1
維基百科:百分號編碼:
https://zh.wikipedia.org/wiki/%E7%99%BE%E5%88%86%E5%8F%B7%E7%BC%96%E7%A0%81