跳到主要內容

← 返回部落格

URL 編碼完整說明:百分比編碼、查詢字串與亂碼網址

有沒有貼過一條連結,發現本該是文字的地方變成 %E4%B8%AD,或某個查詢參數莫名壞掉?那就是 URL 編碼在運作。搞懂它,那些看不懂的字串就變成你能推理的東西。

為什麼網址需要編碼

網址只能包含有限的 ASCII 字元。其他任何東西 —— 空白、中文,或像 ?&#/ 這種有特殊意義的字元 —— 都必須做百分比編碼:用 % 加上該位元組的兩位十六進位值取代。例如空白變成 %20,(UTF-8)變成 %E4%B8%AD

你可以用 URL 編碼工具即時編碼或解碼任何字串。

保留字元 vs 非保留字元

  • 非保留字元(A–Z a–z 0–9 - _ . ~)永遠不需編碼。
  • 保留字元(: / ? # [ ] @ ! $ & ' ( ) * + , ; =)在網址中有結構意義。要不要編碼看情境 —— 在「值」裡面必須編碼,當「結構」則不能編碼。

這正是 encodeURIComponentencodeURI 差別的核心。

encodeURIComponent vs encodeURI

  • encodeURIComponent 連保留字元也編碼。用於單一值 —— 一個查詢參數、一個路徑片段。
  • encodeURI 保留結構字元(/ ? & =)。用於你不想拆散的整條網址
encodeURIComponent("a b&c=d") // "a%20b%26c%3Dd"  ✅ 當值很安全
encodeURI("https://x.com/a b") // "https://x.com/a%20b"  ✅ 整條網址

選錯是常見 bug 來源:對一個值用了 encodeURI,裡面的 & 不會被跳脫,就會破壞你的查詢字串。

%20 vs +

兩者都能代表空白,但用在不同情境。在網址路徑與現代查詢字串中,標準是 %20。用 + 代表空白源自較舊的 application/x-www-form-urlencoded 格式(HTML 表單送出用)。不確定時,%20 是安全、通用的選擇 —— 也是我們工具產生的格式。

經典的「重複編碼」bug

如果一個字串被編碼兩次,%20 會變成 %2520(因為 % 自己被編碼成 %25)。症狀:瀏覽器裡出現字面的 %20,或空白變成 %2520。解法是剛好只編碼一次 —— 不確定輸入狀態就先解碼。用解碼工具可以輕鬆檢視你手上到底是什麼。

快速對照

  • 編碼參數值?→ encodeURIComponent
  • 編碼整條網址?→ encodeURI
  • 看到零星的 %XX?→ 解碼它讀出原文。

用免費的 URL 編碼 / 解碼工具即時編碼與解碼網址與查詢參數 —— 全程在瀏覽器本機執行。