什麼是 URL 編碼?
URL 編碼又稱為百分比編碼(percent-encoding),是 RFC 3986 規範所定義的一種機制,用來在統一資源識別碼(URI)中表示任意資料。在網址中,許多字元——例如空格、斜線、問號、& 符號,以及非 ASCII 的文字——都帶有特殊意義,或本身就不適合直接出現在 URL 裡。百分比編碼會把每一個這類位元組,改寫成一個百分比符號(%)加上兩位代表該位元組數值的十六進位數字。
如何使用這個工具
選擇 編碼(Encode) 可以把純文字轉換成適合放進 URL 的安全字串;選擇 解碼(Decode) 則能把百分比編碼後的字串還原成可閱讀的文字。輸入或貼上你的文字後送出即可。工具也會顯示輸入與輸出的字元長度,讓你一眼看出編碼後字串膨脹了多少。
編碼原理說明
未保留(unreserved)字元集合為 A–Z a–z 0–9 - _ . ~。任何不屬於這個集合的位元組都會被編碼。 $$\text{Output} = \operatorname{encode}\!\left(\text{Text}\right) = \text{each byte} \to \begin{cases} \text{char}, & \text{if unreserved } (A\text{-}Z,\,a\text{-}z,\,0\text{-}9,\,\text{-}\_.\sim) \\ \text{\%XX}, & \text{otherwise (UTF-8 hex)} \end{cases}$$ 舉例來說,空格的位元組數值為 32,換算成十六進位是 0x20,因此會變成 %20。文字會先以 UTF-8 轉換成位元組,所以像表情符號或帶重音的字母這類多位元組字元,會逐一位元組進行編碼。解碼則是相反的過程:每一組 %XX 會被解析成一個十六進位位元組,收集起來的位元組再依 UTF-8 解讀回文字。 $$\text{Output} = \operatorname{decode}\!\left(\text{Text}\right) = \text{scan} \to \begin{cases} \text{byte}(XX), & \text{for each } \text{\%XX} \\ \text{space}, & \text{for } + \\ \text{char}, & \text{otherwise} \end{cases}\ \text{as UTF-8}$$
實際範例
編碼 hello world! 時:字母 h-e-l-l-o 屬於未保留字元,維持不變。空格會變成 %20,驚嘆號(位元組 \(33 = \text{0x21}\))會變成 %21。最終結果為 hello%20world%21。
常見問題
它會把加號編碼成空格嗎? 編碼時,空格會轉成 %20(RFC 3986 風格)。解碼時,為了與表單資料相容,文字中的 + 會被視為空格處理。
為什麼有些字元沒有被改變? 在 RFC 3986 規範下,字母、數字,以及四個未保留符號 - _ . ~ 永遠不需要編碼。
它支援 Unicode 嗎? 支援。文字會以 UTF-8 處理,因此 ASCII 以外的字元會被編碼成多個 %XX 位元組,並能正確解碼還原。