UltKit

URL 編碼與解碼

把文字轉成可以安全放進 URL 的形式,或把 %20 這類序列還原成看得懂的字元。本工具直接使用瀏覽器內建的 encodeURIComponent、encodeURI 與 decodeURIComponent,以表格列出查詢參數,不會傳送任何資料到伺服器。

模式

0 個字元 · 0 個字詞 · 0 行

0 個字元 · 0 個字詞 · 0 行

完全在此瀏覽器分頁中執行,您的文字不會被上傳或儲存。

各函式會跳脫的字元

以瀏覽器內建函式實際計算。encodeURIComponent 不會處理字母、數字與下列符號: ! ' ( ) * - . _ ~

字元encodeURIComponentencodeURI
(空格)%20%20
!!!
"%22%22
#%23#
$%24$
%%25%25
&%26&
'''
(((
)))
***
+%2B+
,%2C,
/%2F/
:%3A:
;%3B;
=%3D=
?%3F?
@%40@
[%5B%5B
]%5D%5D
{%7B%7B
}%7D%7D
|%7C%7C
\%5C%5C
^%5E%5E
`%60%60
<%3C%3C
>%3E%3E
~~~
---
___
...
é%C3%A9%C3%A9
€%E2%82%AC%E2%82%AC
😀%F0%9F%98%80%F0%9F%98%80

百分比編碼與 RFC 3986 的保留字元

URL 只能包含有限的 ASCII 字元。RFC 3986 是 2005 年制定的 URI 語法規範,將這些字元分成兩類。非保留字元包括 A–Z、a–z、0–9 以及 - . _ ~ 這四個符號,永遠不需要編碼。保留字元各有用途:通用分隔符 : / ? # [ ] @ 用來區隔協定、主機、路徑、查詢字串與片段,子分隔符 ! $ & ' ( ) * + , ; = 則用來區隔其中的各個項目,例如查詢字串中的 & 與 =。其他所有字元,以及被當作一般資料使用的保留字元,都必須進行百分比編碼。

百分比編碼會把一個位元組寫成 % 加上兩位十六進位數字。文字會先轉成 UTF-8,因此空格變成 %20,é(兩個位元組)變成 %C3%A9,一個表情符號則會變成四組 %XX。所以搜尋「café & bar」時,連結中會呈現為 caf%C3%A9%20%26%20bar:& 被編碼,伺服器才不會把它當成新參數的開頭。

encodeURIComponent、encodeURI 與解碼

encodeURIComponent 適合處理單一片段,例如查詢值、路徑區段,或作為參數傳遞的重新導向網址。它會跳脫除了非保留字元與 ! ' ( ) * 之外的所有字元,後者因歷史因素 JavaScript 不會處理。encodeURI(整個 URL)假設輸入已是完整網址,因此會保留保留字元,https://example.com/a b?q=1 只有空格會被編碼。對參數值使用 encodeURI 是常見的錯誤:值中的 & 或 # 不會被編碼,進而破壞網址。

解碼可還原上述任一函式的結果。以 GET 送出的 HTML 表單使用較舊的 application/x-www-form-urlencoded 格式,空格寫成 + 而非 %20;處理這類資料時請勾選將 + 視為空格,若加號本身有意義(例如電話號碼),則取消勾選。如果輸入中有 % 後面不是兩位十六進位數字,或位元組不是有效的 UTF-8,解碼會失敗並顯示明確的訊息,而不是自行猜測。當文字包含查詢字串時,其參數會解碼後顯示在工具下方的表格中。若要在網址中放二進位資料,通常改用 Base64url。

常見問題

URL 中的空格該寫成 %20 還是加號?
在路徑中,以及依 RFC 3986 的規定,空格是 %20。+ 只在以 HTML 表單方式編碼的查詢字串中才代表空格,所以使用 %20 在任何地方都最保險。
為什麼我的 URL 裡出現了 %2520?
因為被編碼了兩次。第一次把空格變成 %20,第二次又把 % 本身編碼成 %25。解碼一次即可還原多出來的一層,並且請只在程式中的一個位置編碼數值。
哪些字元永遠不需要百分比編碼?
RFC 3986 的非保留字元:大小寫英文字母 A 到 Z、數字 0 到 9,以及連字號、句點、底線和波浪號。
URL 可以不經編碼就包含中文等非英文字母嗎?
瀏覽器會直接顯示,但實際傳輸時,路徑或查詢字串中的每個非 ASCII 字元都會以百分比編碼的 UTF-8 傳送。網域名稱則使用另一套機制 Punycode,會轉成 xn-- 開頭的標籤。
為什麼解碼時顯示序列格式錯誤?
文字中有 % 後面沒有接兩位十六進位數字,例如單純的「100%」,或位元組解碼後不是有效的 UTF-8。解碼前,請先把單獨的 % 編碼為 %25。