URL 編碼器

編碼和解碼 URL 字串。

免費線上URL編碼器和解碼器

URLs 不能包含空格、& 符號或原始 unicode 字元 - 它們需要百分比編碼。 Dokall 對字串進行編碼以便在 URLs 中安全使用,並將編碼值解碼回純文字。

對於建立查詢字串、偵錯重定向 URLs 以及處理 Web 應用程式中的國際字元至關重要。

什麼是 URL 編碼?

URL 編碼(也稱百分號編碼)將 URL 中不允許或具有特殊含義的字符轉換為安全格式。每個不安全字符會被替換為百分號後跟兩個十六進制數字,表示該字符的 ASCII 或 UTF-8 字節值。

例如,空格變成 %20,& 變成 %26,斜槓 / 變成 %2F。日文字符「日」變成 %E6%97%A5(UTF-8 三個字節,各自百分號編碼)。這確保無論攜帶何種數據,URL 都保持有效且無歧義。

保留字符與非保留字符

URL 有兩類字符。非保留字符可在 URL 任意位置出現而無需編碼:A–Z、a–z、0–9、連字符 (-)、句點 (.)、下劃線 (_) 和波浪號 (~)。這些始終是安全的。

保留字符在 URL 語法中有特殊含義:: / ? # [ ] @ ! $ & ' ( ) * + , ; =。例如,? 開始查詢字符串,& 分隔查詢參數,# 開始片段。當這些字符作為數據(而非分隔符)使用時,必須進行百分號編碼。

棘手之處在於:字符是否需要編碼取決於出現位置。路徑中的 / 分隔目錄(不要編碼);查詢參數值中的 / 是數據(需要編碼)。這種依賴上下文的編碼正是存在不同編碼函數的原因。

JavaScript 中的 encodeURI 與 encodeURIComponent

JavaScript 提供兩個用途不同的編碼函數。

encodeURI() 編碼完整 URI。它保留 URI 中有效的字符:: / ? # [ ] @ ! $ & ' ( ) * + , ; =。當你有完整 URL,只想編碼在任何 URL 位置都無效的字符(空格、非 ASCII 字符等)時使用它。

encodeURIComponent() 編碼 URI 組件——URL 的一部分,如查詢參數值。它會編碼包括 & = ? / 在內的所有保留字符,因為這些可能與 URL 結構衝突。構建查詢字符串時使用:"?search=" + encodeURIComponent(userInput)。

常見錯誤:對查詢字符串中的用户輸入使用 encodeURI()。若用户輸入包含 &,它不會被編碼,瀏覽器會將其解釋為參數分隔符。查詢參數值務必使用 encodeURIComponent()。

不同語言中的 URL 編碼

在 Python 中:urllib.parse.quote() 編碼字符串組件(類似 encodeURIComponent)。urllib.parse.quote_plus() 將空格編碼為 + 而非 %20(用於 application/x-www-form-urlencoded 數據)。urllib.parse.urlencode() 將字典編碼為查詢字符串。

在 Java 中:URLEncoder.encode(str, "UTF-8") 用於表單數據編碼(空格變成 +)。路徑編碼請使用 URI 類構造函數或 Apache Commons HttpClient 等庫。

在 Go 中:url.QueryEscape() 用於查詢字符串編碼(空格變成 +)。url.PathEscape() 用於路徑段編碼(空格變成 %20)。net/url 包提供會自動處理編碼的 URL 解析與構建。

在 PHP 中:urlencode() 將空格編碼為 +(表單編碼)。rawurlencode() 將空格編碼為 %20(RFC 3986)。路徑組件使用 rawurlencode(),表單數據使用 urlencode()。

URL 中的空格:%20 與 + 及各自適用場景

URL 中有兩種方式編碼空格,正確選擇取決於上下文。

%20 是 RFC 3986 定義的標準空格百分號編碼。它在所有 URL 組件中都正確——路徑段、查詢參數名、查詢參數值和片段。

+ 是空格的另一種編碼,但僅適用於 application/x-www-form-urlencoded 內容類型——HTML 表單提交使用的格式。在此上下文(且僅在此上下文)中,空格編碼為 +,而 + 編碼為 %2B。

構建 API 調用 URL 時使用 %20。提交 HTML 表單或發佈表單編碼數據時,+ 是可接受的。大多數服務器和框架兩者都能處理,但使用正確編碼可避免邊界情況和歧義。

常見問題

為什麼 URL 需要編碼?
URL 只能包含有限的 ASCII 字符集。空格、&、=、? 以及非 ASCII 字符(帶重音字母、中日韓字符)具有特殊含義或不被允許。編碼將這些字符轉換為安全的百分號編碼格式,使 URL 保持有效且數據正確傳輸。
encodeURI 與 encodeURIComponent 有何區別?
encodeURI() 編碼完整 URL,保留有效的 URL 分隔符(: / ? # & =)。encodeURIComponent() 編碼 URL 組件(如查詢參數值),編碼包括分隔符在內的所有特殊字符。查詢字符串中的用户輸入請使用 encodeURIComponent()。僅在編碼已有正確結構的完整 URL 時使用 encodeURI()。
URL 中的 %20 是什麼意思?
%20 是空格字符的百分號編碼表示。20 是空格的十六進制 ASCII 碼(十進制 32)。任何字符都可以這樣表示:% 後跟其兩位十六進制碼。例如,%2F 是 /,%26 是 &,%3D 是 =。
應該編碼整個 URL 還是隻編碼查詢參數?
僅編碼包含動態或用户提供數據的部分——通常是查詢參數值,有時也包括路徑段。不要編碼 URL 結構本身(協議、主機、路徑分隔符)。例如:https://example.com/search?q= + encodeURIComponent(userQuery)。用 encodeURIComponent 編碼整個 URL 會破壞協議和主機。
如何處理 URL 中的 Unicode 字符?
Unicode 字符先編碼為 UTF-8 字節,再對每個字節進行百分號編碼。字符「日」(U+65E5)變成三個 UTF-8 字節(0xE6、0x97、0xA5),編碼為 %E6%97%A5。現代瀏覽器在地址欄顯示 Unicode 字符,但向服務器發送百分號編碼形式。標準庫中的所有編碼函數都會自動處理這一點。
+ 與 %20 表示空格有何區別?
用 + 表示空格僅在 application/x-www-form-urlencoded 數據(HTML 表單提交)中有效。%20 是空格的標準百分號編碼,在 URL 任何位置都正確。構建 API URL 時使用 %20;提交表單數據時 + 可接受。大多數服務器兩者都能處理,但使用正確編碼可避免歧義。
URL 編碼與 HTML 編碼相同嗎?
不相同。URL 編碼(百分號編碼)將字符轉換為 %XX 格式以便在 URL 中安全使用。HTML 編碼將字符轉換為實體引用(&、<、')以便在 HTML 中安全顯示。它們解決不同問題:URL 編碼確保 URL 有效性,HTML 編碼防止 XSS 攻擊和顯示問題。在需要另一種編碼的地方使用其中一種會導致錯誤。