認識 URL 及其編碼

2021-10-06 06:48:05 字數 3477 閱讀 5077

參考文獻

url 由網際網路工程任務組織(ietf)uri 工作小組制定並成為乙個網際網路標準,收錄於 rfc1738。

正如有許多不同的獲取資源的方法一樣,描述這些資源的位置也有多種方案。不同的協議有不同的 url 語法,但是 url 的通用語法為其他協議建立新的方案提供了框架。一般而言,url 的編寫方式如下:

:
url 包含特定的協議名稱,後面是冒號,然後是字串,該字串的解釋取決於不同協議的具體實現。

internet 有很多應用層的協議可以獲取網路資源,其 url 的格式語法會有所不同。以下是常見的協議。

prospero prospero directory service雖然 url 除協議外的其餘部分的語法可能會因特定協議而有所不同,但涉及直接對 internet 上的指定主機使用基於 ip 的協議的 url,擁有通用的語法:

//:@:/
其中:@:/都是可選的。url 協議特定部分以雙斜槓 「//」 開頭,表明它符合通用 internet 協議語法。不同的元件遵循以下規則:

注意,使用者名稱和密碼如果存在,後面跟著乙個 @ 字元。在使用者名稱和密碼欄位中,必須對字元: @ /進行編碼。

http(s) 不允許使用使用者名稱或密碼,乙個合法的 http(s) url 格式如下:

http(s)://:/?#
(1)協議名:http 或 https 協議;

(2):主機名。乙個 url 中,既可以使用網域名稱也可以使用 ip 表示主機位址;

(3):埠。主機名和埠之間使用冒號分隔。埠是可選的,如果省略將採用預設埠,http 預設埠是 80,https 預設埠 443;

(4):資源路徑。資源在網路主機上的路徑,路徑也是可選的,預設訪問預設資源;

(5):查詢引數。格式為 key=value,多個引數使用 & 分隔;引數也是可選的;

(6):片段。從 # 開始到最後,一般用於定位到資源內的乙個片段,比如文件的乙個章節;片段也是可選的。

示例如下:

觀察示例,對照 http url 的格式,我們可以知道:

(1)http 為協議;

(2)www.aspxfans.com 為主機網域名稱;

(3)8080 為埠號;

(4)news/index.asp 為資源路徑;

(5)boardid=5&id=24618&page=1 為查詢引數;

(6)name 為資源內的乙個片段。

通過上面對 http(s) url 格式的分析,我麼可以很清楚地知道 http(s) url 中的特殊字元。

字元特殊含義

十六進製制值

:協議與url 實現部分以及主機名與埠號之間的分隔符

%3a/

分隔目錄和子目錄

%2f&

url 中指定的引數間的分隔符

%26=

url 中指定引數的值

%3d?

分隔實際的 url 和引數

%3f#

表示書籤

%23+

表示空格

%2b%

指定特殊字元

%25當以上字元在不表示其特殊含義時,出現在 http(s) url 中均需要對其編碼。

url 是乙個字串行,由數字、字母和特殊字元組成。對 url 進行編碼主要原因有如下幾點:

因此只有字母和數字[0-9a-za-z]、具有特殊含義的保留字元以及非保留字元,才可以不經過編碼直接用於 url。

rfc3986 規定了 url 中非保留字元,即無需轉義的沒有任何特殊含義的字元,其定義如下:

unreserved  = alpha / digit / "-" / "." / "_" / "~"
alpha 表示 52 大小寫英文本母,digit 表示 10 個數字,後面依次時連字元、點號、下劃線和波浪號。

除了上面非保留字元,其他任何字元出現在 url 的不同部分時,如果與該部分的保留字元發生衝突或不可列印或超出 ascii 表示範圍,均需要對其編碼。

url 的編碼方式也比較簡單,即使用字元 % 後跟兩個十六進製制數字(0123456789abcdef 或 0123456789abcdef)表示字元碼值的單個位元組值。比如:

春節
因為上面的 url 引數部分存在 ascii 無法表示的漢字"春節",因此需要對上面 url 引數部分進行編碼,編碼後的 url 是:

%e6%98%a5%e8%8a%82
其中 0xe698a5 是漢字"春"的 utf8 碼值,0xe88a82 是漢字"節"的 utf8 碼值。

以 go 為例,可以使用 url.queryescape 和 url.queryunescape 實現引數的編碼和解碼。

package main

import (

"net/url"

)func main()

執行輸出:

%e6%98%a5%e8%8a%82

春節

上面只是對 http url 的引數進行了編碼,如果 url 中的路徑部分存在特殊字元,比如 / 或者 ?,也需要對其進行編碼,可以呼叫 go 的 url.pathescape 和 url.pathunescape 來完成編譯碼。

[1] rfc1738

[2] rfc3986

[4] 檢視字元編碼(utf-8)

[5] 關於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...