URL 編碼與解碼
把文字轉成可以安全放進 URL 的形式,或把 %20 這類序列還原成看得懂的字元。本工具直接使用瀏覽器內建的 encodeURIComponent、encodeURI 與 decodeURIComponent,以表格列出查詢參數,不會傳送任何資料到伺服器。
0 個字元 · 0 個字詞 · 0 行
0 個字元 · 0 個字詞 · 0 行
完全在此瀏覽器分頁中執行,您的文字不會被上傳或儲存。
各函式會跳脫的字元
以瀏覽器內建函式實際計算。encodeURIComponent 不會處理字母、數字與下列符號: ! ' ( ) * - . _ ~
| 字元 | encodeURIComponent | encodeURI |
|---|---|---|
(空格) | %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。