掃二維碼與項目經理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流
URL encode 實際上是對 URI 進行 encode的,而不是對 URL。

創(chuàng)新互聯(lián)建站專注于福田企業(yè)網站建設,自適應網站建設,商城網站定制開發(fā)。福田網站建設公司,為福田等地區(qū)提供建站服務。全流程按需網站策劃,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務
什么是 URI?
Uniform Resource Identifier (URI,統(tǒng)一資源標志符) ,是用來標識資源的字符串,規(guī)定了以下文法:
上圖可見,有效的 URI 至少包含 scheme,: 以及 path(路徑),如經典的觸發(fā)操作系統(tǒng)發(fā)郵件動作的mailto 格式[1]:
- mailto:[email protected]
- └─┬──┘ └────┬─────────────┘
- scheme path
其他就是可選的組合路徑了,如 scheme://host path ? query # fragment 就會我們常見的 url 格式:
- userinfo host port
- ┌──┴───┐ ┌──────┴──────┐ ┌┴┐
- https://[email protected]:123/forum/questions/?tag=networking&order=newest#top
- └─┬─┘ └───────────┬──────────────┘└───────┬───────┘ └───────────┬─────────────┘ └┬┘
- scheme authority path query fragment
URI包含URLs and URNs
簡單說作用就是:
Reserved Characters(保留字符)
URI 規(guī)定了要保留以下字符作特殊使用:
- ! * ' ( ) ; : @ & = + $ , / ? # [ ]
- 來自 RFC 3986 section 2.2 Reserved Characters (January 2005)
如 ? 用來帶 url 中的參數,/ 用來分割 url, & 用來拼接 query等,保留字符都有自己的作用。
因此需要傳此類字符而不是作特殊字符作用使用時,不能直接放入 url 中,需要編碼,也就是 url encode 做的事情。
encode 很簡單,把保留字符如 ? 轉成 ASCII[2] 的 16 進制表示(? 就是 3F),在前面加一個 % 代表這是轉碼字符即可,也就是 ? 需要 encode 成 %3F 放在 url 中,所以 url encode 又稱作 Percent-encoding。
實際應用
在下述url 中,需要傳入跳轉 BACK_URL 參數 new_login.com?a=12 時,就需要轉移 ? 跟 =g .
https://third_party_login.com?BACK_URL=new_login.com?a=12 就應該轉換成
https://third_party_login.com?BACK_URL=new_login.com%3Fa%3D12
這樣子后面的 ? 與 = 就不會被處理掉,而能夠作為 BACK_URL 這個參數的一部分傳給后端。
http 協(xié)議中 headers 的 content-type 里常見的的 application/x-www-form-urlencoded,指定請求 body 使用 URL encoded。
鑒于珠玉在前,我就整理下Unicode 和 UTF-8 有什么區(qū)別?[3]的內容 ok 了:
簡單來說:
詳細過程:
unicode 在很長一段時間內無法推廣,直到互聯(lián)網的出現,為解決 unicode 如何在網絡上傳輸的問題,于是面向傳輸的眾多 UTF(UCS Transfer Format)標準出現了,顧名思義,UTF-8 就是每次 8 個位傳輸數據,而 UTF-16 就是每次 16 個位。UTF-8 就是在互聯(lián)網上使用最廣的一種 unicode 的實現方式,這是為傳輸而設計的編碼,并使編碼無國界,這樣就可以顯示全世界上所有文化的字符了。UTF-8 最大的一個特點,就是它是一種變長的編碼方式。它可以使用 1~4 個字節(jié)表示一個符號,根據不同的符號而變化字節(jié)長度,當字符在 ASCII 碼的范圍時,就用一個字節(jié)表示,保留了 ASCII 字符一個字節(jié)的編碼做為它的一部分,注意的是 unicode 一個中文字符占 2 個字節(jié),而 UTF-8 一個中文字符占 3 個字節(jié))。從 unicode 到 utf-8 并不是直接的對應,而是要過一些算法和規(guī)則來轉換。
References
[1] mailto 格式: https://www.wikiwand.com/en/Mailto
[2] ASCII: https://www.wikiwand.com/en/American_Standard_Code_for_Information_Interchange
[3] Unicode 和 UTF-8 有什么區(qū)別?: https://www.zhihu.com/question/23374078/answer/69732605
本文轉載自微信公眾號「山盡寫東西的cache」,可以通過以下二維碼關注。轉載本文請聯(lián)系山盡寫東西的cache公眾號。

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網交流