你真的瞭解URLEncode嗎?

使用瀏覽器進行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準備數據。安全

1、爲何須要URL Encoding

在URL的最初設計時,但願能夠經過書面轉錄,好比寫在餐巾紙上告訴另一人,所以URI的構成字符必須是可寫的ASCII字符。
中文不在ASCII字符中,所以中文出如今URL地址中時,須要進行編碼;同時可書寫的ASCII字符中,存在一些不安全字符也須要轉碼,如空格(空格容易被忽略,也容易意想不到的緣由引入)。網絡

不安全字符

不安全字符

2、編碼原理

編碼的原理能夠表述爲:
將須要轉碼的字符,按指定編碼方式(默認使用UTF-8編碼)轉化爲字節流,每一個字節按16進製表示,並添加%組成一個percent編碼。app

例如:漢字 「你好」編碼

  • UTF-8字節流打印爲:-28 -67 -96 -27 -91 -67
  • 對應的16進製表示爲:E4 BD A0 E5 A5 BD
  • URLEncode編譯後爲:%E4%BD%A0%E5%A5%BD

2.一、哪些字符須要轉碼

上文中提到須要轉碼的字符,那麼哪些字符是須要轉碼的字符?
這裏涉及到兩個概念:Reserved(保留字符)Unreserved(非保留字符)url

  • Reserved(保留字符)是那些具備特殊含義的字符,例如:"/"字符用於URL不一樣部分的分界符;
  • Unreserved(非保留字符)沒有特殊含義,包含希臘字母 / 數字 / "-" / "." / "_" / "~"

保留字符&非保留字符

回到剛纔的問題,哪些字符是須要轉碼的字符?設計

  • 一、除了Reserved(保留字符)Unreserved(非保留字符)以外的全部字符,均須要percent編碼;
  • 二、某些狀況下Reserved(保留字符)也須要進行percent編碼:
    Reserved(保留字符)不用於URL分隔符,而是用於其餘的位置,不表明某種特性的含義時,須要進行percent編碼。例如:保留字符用於URL請求query後面的value中時,要對此時用到的Reserved(保留字符)作percent編碼;

2.二、注意:空格的編碼有 「+」和「%20」兩種

結論:code

  • 一、空格編碼爲+的狀況:
    提交表單時請求時Content-Type:application/x-www-form-urlencoded的狀況下,URL請求查詢字符串中出現空格時,需替換爲+
  • 二、其餘狀況空格編碼爲%20

依據:orm

按照 rfc3986 標準,空格在進行編碼時,編碼後對應爲%20

空格ASCII表16進製表示對應爲20

但根據W3C標準:,提交表單時請求時Content-Type:application/x-www-form-urlencoded狀況下,URL請求查詢字符串中出現空格時,需替換爲+

W3C中空格替換爲+號依據

3、參考

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

========== THE END ==========

歡迎關注個人公衆號

相關文章
相關標籤/搜索