免費線上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 表單或發佈表單編碼數據時,+ 是可接受的。大多數服務器和框架兩者都能處理,但使用正確編碼可避免邊界情況和歧義。