RevealTheme logo

URL 編碼與解碼工具

將文字轉換為 URL 安全的編碼(百分號編碼),或進行反向轉換。適用於查詢字串、重新導向和 OAuth 流程。

如何使用本工具

  1. 1

    Choose a mode with the Encode or Decode button at the top (Encode is selected by default).

  2. 2

    Type or paste your text into the input box — a raw value to encode, or a percent-encoded string to decode.

  3. 3

    Click Run to convert the text; the result appears in the monospace box below.

  4. 4

    Copy the output from the result box, or switch modes and click Run again to reverse the conversion.

什麼是 URL 編碼,何時需要它?

URL 編碼(也稱為「百分號編碼」,由 RFC 3986 規定)是將在 URL 中具有特殊含義的字元——或在 URL 中根本不安全的字元——轉換為十六進位逸出序列「%XX」的過程。URL 規範保留了某些具有結構含義的字元:「?」開啟查詢字串,「#」開啟片段識別碼,「&」分隔查詢參數,「/」分隔路徑段,等等。如果使用者輸入包含其中任何字元,而你將其原樣嵌入 URL,剖析器就會誤解它。URL 編碼透過將每個保留字元或不安全字元替換為其前綴為「%」的十六進位位元組表示,來避免這種情況。空格變為 %20,「&」變為 %26,「=」變為 %3D。非 ASCII 字元(西里爾文、中文、表情符號)會被轉換為多位元組的 UTF-8 序列,其中每個位元組都進行百分號編碼。當你點擊連結時,瀏覽器會自動處理這些;但每當你透過程式碼建構 URL 時——在建立搜尋查詢、重新導向目標、OAuth 回呼或 webhook 簽章時——都必須先對使用者提供的值進行編碼。本工具使用的正是你的 JavaScript 程式碼會使用的 encodeURIComponent / decodeURIComponent 函式,因此其行為與生產環境完全一致。

常見使用場景

  • 在將使用者搜尋詞附加到搜尋 URL 之前對其進行編碼(?q=user+input)。

  • 安全地將 OAuth 的 redirect_uri 參數傳遞給授權伺服器。

  • 建構在查詢字串中包含已編碼 JSON 負載的 webhook URL。

  • 對「returnTo」URL 進行編碼,使其在穿過其他 URL 時得以保留。

  • 解碼提交表單後在網址列中看到的已編碼值。

  • 測試格式錯誤的 URL 是如何被剖析的:對一個特殊字元進行編碼,觀察會發生什麼。

常見問題

我何時應該對 URL 進行編碼?
在將使用者提供的值放入 URL 之前,務必對其進行編碼:無論是查詢參數、路徑段還是片段識別碼。不進行編碼是最常見的細微錯誤來源之一:值「貓 & 狗」會破壞查詢字串,直到它被編碼為「貓%20%26%20狗」為止。
encodeURI 和 encodeURIComponent 有什麼區別?
encodeURI 用於完整的 URL:它會保留「/」、「?」、「&」、「=」等結構字元不變,因為它們在 URL 中具有含義。encodeURIComponent 用於 URL 的各個部分(查詢值、路徑段):它會編碼除字母數字之外的所有字元。請對單一查詢值使用 encodeURIComponent;切勿對使用者提供的查詢值使用 encodeURI(它不會逸出「&」,從而破壞你的查詢字串)。
什麼是 URL 安全的 Base64,它與 URL 編碼有何不同?
它們是不同的概念。URL 編碼(即本工具)逐字元地替換特殊字元。URL 安全的 Base64 是 Base64 的一種變體,它使用「-」和「_」代替「+」和「/」,因此其輸出無需額外編碼即已對 URL 安全。
為什麼「+」有時會被解碼為空格?
在 application/x-www-form-urlencoded(表單提交)中,「+」是空格的簡寫。大多數解碼器會保留這一點。在現代 URI 剖析中,「%20」才是空格的正確編碼。decodeURIComponent 會將「+」視為字面意義的「+」;請使用 decodeURI 或表單解碼器來將「+」轉換為空格。
非 ASCII 字元是如何編碼的?
它們首先被轉換為 UTF-8 位元組,然後每個位元組再進行百分號編碼。因此,「café」會變為「caf%C3%A9」:「é」是兩個 UTF-8 位元組(0xC3 0xA9)。本工具能正確處理 UTF-8;某些老舊的工具使用 Latin-1 進行編碼,會產生不同的輸出。
URL 編碼和 HTML 實體編碼是一回事嗎?
不是。URL 編碼(%XX)為 URL 逸出字元。HTML 實體編碼(&、<)為 HTML 標記逸出字元。這兩種上下文不同;在一種上下文中使用另一種的編碼是常見的 XSS 錯誤。

相關工具