百分號編碼是什么!
百分號編碼(Percent-Encoding)也被稱為 URL 編碼,是一種編碼機制。該機制主要應用於 URI 編碼中,URI 包含 URL 和 URN,所以它們也同樣適用。除此之外,也用於 MIME 類型為"application/x-www-form-urlencoded"的內容。
url編碼解碼,又叫百分號編碼,是統一資源定位(URL)編碼方式。URL地址(常說網址)規定了常用地數字,字母可以直接使用,另外一批作為特殊用戶字符也可以直接用(/,:@等),剩下的其它所有字符必須通過%xx編碼處理。 現在已經成為一種規范了,基本所有程序語言都有這種編碼,如js:有encodeURI、encodeURIComponent,PHP有 urlencode、urldecode等。編碼方法很簡單,在該字節ascii碼的的16進制字符前面加%. 如 空格字符,ascii碼是32,對應16進制是'20',那么urlencode編碼結果是:%20
foo://example.com:8042/over/there?name=ferret#nose
\_/ \______________/ \________/\_________/ \__/
| | | | |
scheme authority path query fragment
URI是統一資源標識的意思,通常我們所說的Url只是URI的一種。典型Url的格式如上面所示。下面提到的Url編碼,實際上應該指的是URI編碼。
為什么需要Url編碼
通常如果一樣東西需要編碼,說明這樣東西並不適合傳輸。原因多種多樣,如Size過大,包含隱私數據,對於Url來說,之所以要進行編碼,是因為Url中有些字符會引起歧義。
例如Url參數字符串中使用key=value鍵值對這樣的形式來傳參,鍵值對之間以&符號分隔,如/s?q=abc& ie=utf-8。如果你的value字符串中包含了=或者&,那么勢必會造成接收Url的服務器解析錯誤,因此必須將引起歧義的&和= 符號進行轉義,也就是對其進行編碼。
又如,Url的編碼格式采用的是ASCII碼,而不是Unicode,這也就是說你不能在Url中包含任何非ASCII字符,例如中文。否則如果客戶端瀏覽器和服務端瀏覽器支持的字符集不同的情況下,中文可能會造成問題。
Url編碼的原則就是使用安全的字符(沒有特殊用途或者特殊意義的可打印字符)去表示那些不安全的字符。
哪些字符需要編碼
RFC3986文檔規定,Url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~4個特殊字符以及所有保留字符。
US-ASCII字符集中沒有對應的可打印字符
Url中只允許使用可打印字符。US-ASCII碼中的10-7F字節全都表示控制字符,這些字符都不能直接出現在Url中。同時,對於80-FF字節(ISO-8859-1),由於已經超出了US-ACII定義的字節范圍,因此也不可以放在Url中。
| 空格 | Url在傳輸的過程,或者用戶在排版的過程,或者文本處理程序在處理Url的過程,都有可能引入無關緊要的空格,或者將那些有意義的空格給去掉 |
| 引號以及<> | 引號和尖括號通常用於在普通文本中起到分隔Url的作用 |
| # | 通常用於表示書簽或者錨點 |
| % | 百分號本身用作對不安全字符進行編碼時使用的特殊字符,因此本身需要編碼 |
| {}|\^[]`~ | 某一些網關或者傳輸代理會篡改這些字符 |
需要注意的是,對於Url中的合法字符,編碼和不編碼是等價的,但是對於上面提到的 這些字符,如果不經過編碼,那么它們有可能會造成Url語義的不同。因此對於Url而言,只有普通英文字符和數字,特殊字符$-_.+!*'()還有保留 字符,才能出現在未經編碼的Url之中。其他字符均需要經過編碼之后才能出現在Url中。
常見字符的Url編碼列表:
| ! | * | " | ' | ( | ) | ; | : | @ | & |
%21 |
%2A |
%22 |
%27 |
%28 |
%29 |
%3B |
%3A |
%40 |
%26 |
| = | + | $ | , | / | ? | % | # | [ | ] |
%3D |
%2B |
%24 |
%2C |
%2F |
%3F |
%25 |
%23 |
%5B |
%5D |
參考:https://www.cnblogs.com/leaven/archive/2012/07/12/2588746.html
