ToolAct工具行動

URL 編碼解碼工具

快速進行 URL 編碼和解碼,支援多種編碼模式

輸入內容
字元數: 0
字節數: 0
轉換結果
字元數: 0
字節數: 0

選擇轉換方式

什麼是 URL 編碼?

URL 編碼(也稱為百分號編碼)是一種將字元轉換為可在 URL 中安全傳輸的格式的機制。因為 URL 只能包含 ASCII 字元集中的特定字元,所以其他字元(如中文、空格、特殊符號等)需要被編碼為 %XX 格式,其中 XX 是字元的十六進位值。 例如:空格會被編碼為 %20,中文字元「你」會被編碼為 %E4%BD%A0。 實際開發中還需要區分整段 URL、查詢參數和路徑片段的編碼方式;例如空格、斜線、問號、等號在不同位置含義不同,錯誤編碼可能導致參數遺失或路由解析異常。

使用方式

使用方式

  1. 在輸入框中輸入或貼上要編碼/解碼的文字
  2. 選擇編碼方式:encodeURIComponent 或 encodeURI
  3. 結果會自動顯示,可一鍵複製或交換輸入/輸出
  4. 解碼時,請選擇對應的解碼方式

URL 語境

  • 對查詢值和路徑區段使用 component 編碼;使用錯誤的函式編碼整個 URL 可能會破壞 /、? 和 & 等分隔符。
  • 解碼時,請檢查是否存在雙重編碼,例如 %2520,這代表百分比符號被再次編碼。

使用場景

安全編碼查詢參數當數值將用於 URL 查詢參數、路徑區段或類表單載荷時,使用 encodeURIComponent 模式。它比 encodeURI 更積極地編碼保留字元,並同時顯示字元數和位元組數。這個結果是大多數伺服器端解析器在問號之後或 JSON Pointer 區段內所預期的格式。
編碼或解碼完整 URL處理完整 URL 且希望保留 : / ? & 等分隔符的結構意義時,切換到 encodeURI 或 decodeURI。component 和完整 URI 模式分開存放以避免意外的過度編碼。當輸入已經是 URL 格式且只需收緊使用者資料部分時,這是正確的選擇。
從百分號轉義中還原可讀文字解碼 component 或完整 URI 字串,並使用相反模式將有效輸出交換回輸入。畸形百分號序列導致的轉換錯誤會顯示在輸出中並阻止交換,避免不完整的 %XX 污染後續的複製貼上。像 %2520 這樣的雙重編碼片段會顯示為需要第二次解碼的嵌套轉義。
檢查編碼後的表單內容切換到 application/x-www-form-urlencoded 檢視以觀察 '+' 和 '%20' 在空格處理上的差異,然後解碼從開發工具複製的 x-www-form-urlencoded 載荷以還原原始鍵名。這也有助於閱讀 POST 請求的內容以確認表單實際傳送了客戶端 JavaScript 預期的內容。RFC 3986 為表單內容保留了單獨的規則,這就是為什麼 '+' 在許多 API 中仍然存在。
依 RFC 3986 區分保留字元與非保留字元在除錯簽章不匹配或嚴格 API 回傳 400 錯誤時,第一步是檢查每個位元組是否屬於保留字元集(gen-delims : / ? # [ ] @ 和 sub-delims !$&'()*+,;=)或非保留字元集(A-Z a-z 0-9 - . _ ~)。查詢值對保留字元使用百分號編碼,而路徑區段將 '/' 視為結構字元。選擇 %20 還是 '+' 取決於編碼後的數值將放在哪裡,因此同一個字串根據 URL 位置的不同可以合法地以三種不同編碼出現。

技術原理

URL 編碼(百分號編碼)由 RFC 3986 §2.1 定義,將字元轉換為 %XX 格式,其中 XX 是 UTF-8 位元組值的兩位大寫十六進位表示。RFC 定義了兩個字元類別:非保留字元(A-Z a-z 0-9 - _ . ~)永遠不會被編碼,以及保留字元(gen-delims : / ? # [ ] @ 和 sub-delims ! $ & ' ( ) * + , ; =)其編碼取決於上下文——它們在某些 URL 組件中具有結構意義,但在其他地方是字面資料。 JavaScript 提供兩個作用範圍不同的內建函式。encodeURIComponent() 編碼除 A-Z a-z 0-9 - _ . ! ~ * ' ( ) 以外的所有字元——這是編碼個別查詢參數值、路徑區段和片段識別碼的正確選擇。encodeURI() 額外保留結構字元 : / ? # [ ] @ ! $ & ' ( ) * + , ; =,設計用於編碼完整 URI 同時保持其語法結構完整。關鍵區別在於 encodeURIComponent() 會編碼 / 和 &,如果套用到整個字串會破壞 URL,而 encodeURI() 則保留它們。 空格處理是最常見的互通性陷阱。RFC 3986 指定 %20 作為空格字元(U+0020)的標準百分號編碼。然而 application/x-www-form-urlencoded MIME 類型(自 HTML 4.01 起用於 HTML 表單提交)將空格編碼為 +。兩者不可互換:預期 %20 的伺服器會將 + 解讀為字面量,預期 + 的伺服器會將 %20 視為百分號後跟 20。本工具使用 encodeURIComponent() 產生 %20,符合 RFC 3986。解碼 x-www-form-urlencoded 載荷(來自 POST 主體或舊版中介軟體解析的查詢字串)的使用者應注意此差異。 多位元組字元處理是自動的但值得理解:輸入字串先編碼為 UTF-8 位元組,然後每個位元組分別進行百分號編碼。一個 CJK 字元如「你」(U+4F60)佔用 3 個 UTF-8 位元組(E4 BD A0),產生 %E4%BD%A0。如果伺服器使用不同字元集如 GBK 解析,同一字元編碼為 %C4%E3(2 位元組),除非雙方約定 UTF-8 否則解碼結果會出現亂碼。雙重編碼是另一個常見錯誤:%2520 表示字面百分號(%25)後跟 20,表示輸入已經被百分號編碼又被編碼了一次。解碼模式會擷取格式錯誤的序列(不完整的 %XX)並呈現錯誤,而非靜默產生垃圾資料。

  • encodeURIComponent 與 encodeURI:encodeURIComponent 編碼 / ? & #,適用於查詢值、路徑區段和片段;encodeURI 保留這些結構字元,適用於完整 URL——使用錯誤的函式是最常見的 URL 編碼錯誤
  • RFC 3986 保留字元集合:gen-delims(: / ? # [ ] @)承載 URL 語法;sub-delims(! $ & ' ( ) * + , ; =)可能是分隔符或資料,取決於 URL 組件——上下文決定保留字元是否需要百分號編碼
  • 空格編碼:RFC 3986 標準格式為 %20(由 encodeURIComponent 產生);application/x-www-form-urlencoded 使用 +(HTML 表單預設值)——兩者在語義上不相容,混用會破壞伺服器端解析器
  • UTF-8 多位元組編碼:「你」(U+4F60)→ UTF-8 位元組 E4 BD A0 → %E4%BD%A0(3 個百分號編碼的八位元組);同一字元在 GBK 下 → %C4%E3(2 個八位元組)——客戶端和伺服器之間的字元集約定對非 ASCII 文字是強制性的
  • 雙重編碼偵測:%2520 先解碼為 %20 再解碼為空格——解碼模式的輸出會呈現此模式;格式錯誤的序列如 %ZZ 或 %2(不完整)會被捕獲並報告為錯誤
  • IRI(RFC 3987):國際化資源識別碼允許 URL 中直接使用 Unicode 字元;瀏覽器在網址列顯示解碼形式,但在傳輸時發送百分號編碼的 UTF-8 形式——本工具的編碼模式顯示實際在網路上傳輸的內容
  • decodeURIComponent 錯誤處理:傳入包含不完整百分號序列(% 後跟少於 2 位十六進位數字)的字串會拋出 URIError——本工具將呼叫包在 try/catch 中並呈現錯誤訊息,而非靜默傳回空字串

範例

編碼中文字元(UTF-8 百分號編碼)

輸入:  你好世界 (4 個 CJK 字元,12 個 UTF-8 位元組)
輸出:  %E4%BD%A0%E5%A5%BD%E4%B8%96%E7%95%8C

每個 UTF-8 位元組(E4、BD、A0、...)轉為 %XX
RFC: RFC 3986 第 2.1 節定義 URI 的百分號編碼
用途: 查詢參數、路徑片段、表單資料提交

編碼查詢字串分隔符

輸入:  name=张三&age=20
輸出:  name%3D%E5%BC%A0%E4%B8%89%26age%3D20

%3D 編碼 '='(鍵與值之間的分隔符)
%26 編碼 '&'(參數之間的分隔符)
RFC: RFC 3986 第 3.4 節定義查詢元件的保留字元

編碼完整 URL(部分編碼)

輸入:  https://example.com/search?q=你好&type=web
輸出:  https://example.com/search?q=%E4%BD%A0%E5%A5%BD&type=web

備註:  scheme、host 與既有分隔符「不」進行編碼
僅對非 ASCII 的查詢值進行百分號編碼
RFC: RFC 3986 第 3 節定義階層式 URI 元件

編碼空白字元(兩種慣例)

路徑片段:  %20(符合 RFC 3986)
查詢字串:  +(HTML 表單的歷史慣例)

範例:/search for me -> /search%20for%20me
範例:q=hello world -> q=hello+world

兩者解碼結果相同;encodeURI 使用 %20,部分實作中 encodeURIComponent 在路徑使用 %20、查詢使用 +

常見問題

URL 編碼的作用是什麼?

把 URL 中不安全的字元換成 % 編碼:空白 → %20、& → %26、# → %23 等。RFC 3986 列出了哪些字元是安全的(英數字加上 -、_、.、~)以及哪些需要編碼。瀏覽器、伺服器與 HTTP 函式庫都會在適當的邊界套用或預期 URL 編碼。

encodeURI 和 encodeURIComponent 有什麼差別?

encodeURI 會保留 URL 語法字元(: / ? # & =),它預期收到的是整個 URL;encodeURIComponent 連這些字元也會編碼,因為它預期收到的是單一參數值。頁面同時提供兩種模式:查詢參數用 component 編碼,整段 URL 用 URI 編碼。

為什麼空白有時是 %20、有時是 +?

%20 是 URI 標準;+ 是 HTML 表單送出時 application/x-www-form-urlencoded MIME 類型使用的舊慣例。多數伺服器會把它們視為相同,但嚴格來說並不等價——現代 URL 中請使用 %20。

需要編碼 Unicode 字元嗎?

RFC 3986 只允許 ASCII;非 ASCII 必須先用 UTF-8 編碼再做百分號轉義(中 → %E4%B8%AD)。現代瀏覽器網址列會顯示 Unicode 形式,但傳輸時送出的是編碼後的形式。頁面會自動完成 UTF-8 編碼步驟。

哪些字元絕對不該編碼?

RFC 3986 中的「非保留字元」:A-Z、a-z、0-9、-、_、.、~。雖然技術上允許編碼,但會產生不同的 URL 字串;伺服器在規範化規則下,可能把「a」與「%61」當成相等,也可能視為不同。

為什麼解碼後的 URL 看起來怪怪的?

很可能是被「雙重編碼」了:%2520 解碼一次得到 %20,再解一次才是空白——表示有人對 URL 做了兩次編碼。遇到這種情況就解碼兩次。某些伺服器會自動雙重編碼,請檢查你客戶端的編碼行為。

編碼是在本機完成的嗎?

是的。encodeURIComponent 與 decodeURIComponent 都在你的瀏覽器中執行,URL 不會被上傳。