URL編碼知識摘抄備忘

2022-03-15 16:16:31 字數 4265 閱讀 6899

網頁工具

參考:維基百科

某篇部落格

通常如果一樣東西需要編碼,說明這樣東西並不適合傳輸。原因多種多樣,如size過大,包含隱私資料,對於url來說,之所以要進行編碼,是因為url中有些字元會引起歧義。

uri所允許的字元分作保留未保留保留字元是那些具有特殊含義的字元. 例如, 斜線字元用於url (或者更一般的, uri)不同部分的分界符.未保留字元沒有這些特殊含義. 百分號編碼把保留字元表示為特殊字串行。上述情形隨uri與uri的不同版本規格會有輕微的變化。

uri所允許的字元分作保留與未保留。保留字元是那些具有特殊含義的字元. 例如, 斜線字元用於url (或者更一般的, uri)不同部分的分界符. 未保留字元沒有這些特殊含義. 百分號編碼把保留字元表示為特殊字串行。上述情形隨uri與uri的不同版本規格會有輕微的變化。

rfc 3986 section 2.2 保留字元 (2023年1月)

rfc 3986 section 2.3 未保留字元 (2023年1月)ab

cdef

ghij

klmn

opqr

stuv

wxyz

abcd

efgh

ijkl

mnop

qrst

uvwx

yzuri中的其它字元必須用百分號編碼。uri中的其它字元必須用百分號編碼。

url編碼的原則就是使用安全的字元(沒有特殊用途或者特殊意義的可列印字元)去表示那些不安全的字元。

例如,url引數字串中使用key=value鍵值對這樣的形式來傳參,鍵值對之間以&符號分隔,如/s?q=abc&ie=utf-8。如果你的value字串中包含了=或者&,那麼勢必會造成接收url的伺服器解析錯誤,因此必須將引起歧義的&和=符號進行轉義,也就是對其進行編碼。

又如,url的編碼格式採用的是ascii碼,而不是unicode,這也就是說你不能在url中包含任何非ascii字元,例如不能在url中包含中文。否則如果客戶端瀏覽器和服務端瀏覽器支援的字符集不同的情況下,中文可能會造成問題。

參考ascii 維基百科

unicode 維基百科

utf-8 維基百科

rfc3986文件規定,url中只允許包含英文本母(a-za-z)、數字(0-9)、-_.~4個特殊字元以及所有保留字元。rfc3986文件對url的編譯碼問題做出了詳細的建議,指出了哪些字元需要被編碼才不會引起url語義的轉變,以及對為什麼這些字元需要編碼做出了相應的解釋。

us-ascii字符集中沒有對應的可列印字元:url中只允許使用可列印字元。us-ascii碼中的10-7f位元組全都表示控制字元,這些字元都不能直接出現在url中。同時,對於80-ff位元組(iso-8859-1),由於已經超出了us-acii定義的位元組範圍,因此也不可以放在url中。

保留字元:url可以劃分成若干個元件,協議、主機、路徑等。有一些字元(:/?#@)是用作分隔不同元件的。例如:冒號用於分隔協議和主機,/用於分隔主機和路徑,?用於分隔路徑和查詢引數,等等。還有一些字元(!$&'()*+,;=)用於在每個元件中起到分隔作用的,如=用於表示查詢引數中的鍵值對,&符號用於分隔查詢多個鍵值對。當元件中的普通資料報含這些特殊字元時,需要對其進行編碼。

rfc3986中指定了以下字元為保留字元:! * ' ( ) ; : @ & = + $ , / ? # [ ]

不安全字元:還有一些字元,當他們直接放在url中的時候,可能會引起解析程式的歧義。這些字元被視為不安全字元,原因有很多。

空格:url在傳輸的過程,或者使用者在排版的過程,或者文字處理程式在處理url的過程,都有可能引入無關緊要的空格,或者將那些有意義的空格給去掉。

引號以及<>:引號和尖括號通常用於在普通文字中起到分隔url的作用

#:通常用於表示書籤或者錨點

%:百分號本身用作對不安全字元進行編碼時使用的特殊字元,因此本身需要編碼

{}|\^`~:某一些閘道器或者傳輸**會篡改這些字元

需要注意的是,對於url中的合法字元,編碼和不編碼是等價的,但是對於上面提到的這些字元,如果不經過編碼,那麼它們有可能會造成url語義的不同。因此對於url而言,只有普通英文本元和數字,特殊字元$-_.+!*'()還有保留字元,才能出現在未經編碼的url之中。其他字元均需要經過編碼之後才能出現在url中。

但是由於歷史原因,目前尚存在一些不標準的編碼實現。例如對於~符號,雖然rfc3986文件規定,對於波浪符號~,不需要進行url編碼,但是還是有很多老的閘道器或者傳輸**會進行編碼。

url編碼通常也被稱為百分號編碼(url encoding,also known as percent-encoding),是因為它的編碼方式非常簡單,使用%百分號加上兩位的字元——0123456789abcdef——代表乙個位元組的十六進製制形式。url編碼預設使用的字符集是us-ascii。例如a在us-ascii碼中對應的位元組是0x61,那麼url編碼之後得到的就是%61,我們在位址列上輸入實際上就等同於在google上搜尋abc了。又如@符號在ascii字符集中對應的位元組為0x40,經過url編碼之後得到的是%40。

對於非ascii字元,需要使用ascii字符集的超集進行編碼得到相應的位元組,然後對每個位元組執行百分號編碼。對於unicode字元,rfc文件建議使用utf-8對其進行編碼得到相應的位元組,然後對每個位元組執行百分號編碼。如"中文"使用utf-8字符集得到的位元組為0xe4 0xb8 0xad 0xe6 0x96 0x87,經過url編碼之後得到"%e4%b8%ad%e6%96%87"。

如果某個位元組對應著ascii字符集中的某個非保留字元,則此位元組無需使用百分號表示。例如"url編碼",使用utf-8編碼得到的位元組是0x55 0x72 0x6c 0xe7 0xbc 0x96 0xe7 0xa0 0x81,由於前三個位元組對應著ascii中的非保留字元"url",因此這三個位元組可以用非保留字元"url"表示。最終的url編碼可以簡化成"url%e7%bc%96%e7%a0%81" ,當然,如果你用"%55%72%6c%e7%bc%96%e7%a0%81"也是可以的。

由於歷史的原因,有一些url編碼實現並不完全遵循這樣的原則。

參見 某篇部落格

<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>> 

注:我在使用 工具時,發現乙個漢字被轉換為兩位元組(4個十六進製制數),而不是三位元組。經過記事本實際儲存,hxd工具驗證,實際上這些網頁轉換為了

例如,"中文"兩字:(加刪除線的是檔案資訊頭,參考 file signatures table )

網頁工具: 中文

記事本utf-8:ef bb bfe4 b8 ad e6 96 87

記事本unicode: ff fe2d 4e 87 65

記事本 unicode big endian: fe ff4e 2d 65 87

實際url編碼:%e4%b8%ad%e6%96%87

可見網頁工具採用的是 unicode big endian。實際的url編碼採用utf-8。

little endian

,利於計算機處理);高位址儲存低位資料,低位址儲存高位資料(大端方式,

big endian

,和人類一般思維類似)。

bmp<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>> 

在電腦術語中,統一資源識別符號(uniform resource identifier,或uri)是乙個用於標識某一網際網路資源名稱的字串。 該種標識允許使用者對網路中(一般指全球資訊網)的資源通過特定的協議進行互動操作。uri由包括確定語法和相關協議的方案所定義。

與url和urn的關係

右圖:url方案分類圖

url(定位符)和urn(名稱)方案屬於uri的子類,uri可以為url或urn兩者之一或同時是uri和urn。技術上講,url和urn屬於資源id;但是,人們往往無法將某種方案歸類於兩者中的某乙個:所有的uri都可被作為名稱看待,而某些方案同時體現了兩者中的不同部分。

uri可被視為定位符(url),名稱(urn)或兩者兼備。統一資源名(urn)如同乙個人的名稱,而統一資源定位符(url)代表乙個人的住址。換言之,urn定義某事物的身份,而url提供查詢該事物的方法。

URL編碼 解碼

url編碼 通過頁面傳輸資料給伺服器時,如果包含了一些特殊字元是無法傳送的。這時就需要先把要傳送的資料轉換成url編碼格式,再傳送給伺服器。伺服器會自動識別出資料是使用url編碼過的,然後會自動把資料轉換回來 url編碼 解碼的4個方法 encodeurl encodeurlcomponent de...

URL 字元編碼

url 編碼會將字元轉換為可通過網際網路傳輸的格式。web 瀏覽器通過 url 從 web 伺服器請求頁面。url 是網頁的位址,比如 url 只能使用 ascii 字符集來通過網際網路進行傳送。由於 url 常常會包含 ascii 集合之外的字元,url 必須轉換為有效的 ascii 格式。url...

關於URL編碼

1.encodecomponent編碼url,url不能直接使用,需要編碼 var rlt var url var params for var i in params for var i in params console.log rlt 1.url就是 只要上網,就一定會用到.只有字母和數字 0...