網址百分比編碼:%20、+ 與 %2F 到底是什麼意思
百分比編碼是把網址無法安全承載的字元,寫成百分號加上它的十六進位位元組值。空白會變成 %20,和號變成 %26,斜線變成 %2F。這種編碼能保護連結的結構,因為 & 和 = 這類字元會分隔查詢字串的各個部分。
哪些字元可以維持原樣
URI 標準(RFC 3986)是網址的基礎,它規定某些字元不需要改動:A 到 Z、a 到 z、數字,以及四個符號 - _ . ~。這些字元永遠不需要編碼。其他字元在網址中都有職責:冒號分隔協定與其餘部分,斜線分隔路徑,問號開始查詢,井號開始片段,& 和 = 則把查詢切成名稱與值。有職責的字元,若要當成資料而非結構來用,就必須編碼。
這也是為什麼同一個字元在某處需要編碼、在另一處不需要。在查詢值中,和號必須寫成 %26,否則連結會在錯誤的地方被切開。在連結的路徑中,它只是一個普通字元。
非英文字母
基本英文以外的字母,會以 UTF-8 位元組編碼,每個位元組寫成一個百分號代碼。café 中的 é 是 C3 與 A9 兩個位元組,所以變成 %C3%A9,整個字就是 caf%C3%A9。
一個簡單例子能讓規則更具體。文字 a b&c=d/é 若以組件方式編碼,會變成 a%20b%26c%3Dd%2F%C3%A9。凡是不屬於安全字母、數字或符號的字元都會被編碼:空白、和號、等號、斜線,以及帶重音的字母。
組件編碼或整段網址
兩種編碼各有用途。組件編碼會把所有保留字元都當成資料。它用在單一個值上,例如連結中的搜尋詞或檔案名稱。把 "rock & roll" 當成搜尋詞編碼,會得到 rock%20%26%20roll,和號因此留在值之內。
整段網址編碼則會保留結構。把 https://example.com/a b 編碼,會得到 https://example.com/a%20b,斜線與冒號維持不變。它用在需要整理成有效的完整網址時,而不是用在要放進連結裡的值。
網址工具 因此提供「組件」與「整段網址」兩種設定。整段網址解碼也會保留已跳脫的結構字元,例如 %26 與 %3D,所以連結解碼後仍然可以運作。
加號與表單資料
網頁表單使用另一種慣例。表單以表單資料送出時,空白會寫成 +,而不是 %20。字面上的加號則寫成 %2B。所以 C++ tips 在表單資料中會變成 C%2B%2B+tips,在一般組件編碼中則是 C%2B%2B%20tips。
解碼也有同樣的差別。在查詢字串中,+ 通常代表空白。在連結的路徑中,+ 就是加號。工具只有在勾選 將 + 視為空白(表單資料) 時,才會把 + 讀成空白,所以路徑和加號是真實字元的值,請保持取消勾選。
讀懂很長的查詢字串
連結常會在問號之後帶著各種設定。看這個例子:
https://shop.example/search?q=red%20shirt&size=M&tag=summer%2Bsale
解碼後,它的意思是搜尋紅色襯衫、尺寸是 M、標籤是 summer+sale。%2B 仍是加號,因為它原本就是被編碼的。把連結貼到網址工具,它會在解碼後列出每個名稱與值,讓很長的連結更容易閱讀。如果你只想要不含追蹤設定的較短網址,請先清除連結追蹤碼。
重複編碼
最常見的錯誤是把同一個值編碼兩次。把文字 %20 再編碼一次,會得到 %2520,因為百分號本身會被編碼成 %25。頁面於是尋找值中字面上的 %20,搜尋或頁面就對不上了。請先解碼一次、檢查結果,只有在需要時才編碼。
損壞的跳脫字元
百分號後面必須接兩個十六進位數字,而且這些數字對於帶重音的字母必須構成有效的 UTF-8。被截斷的連結,或文字中隨手打的百分號,可能留下像 %E0%A4%A 這樣損壞的跳脫字元。工具會盡量解碼能解的部分,把損壞的位元組原樣保留,並回報有多少無法解碼。它不會在第一個錯誤就停下來。
特殊情況
- 手動輸入的連結含空白。 瀏覽器網址列會幫你編碼空白,但從文件複製來的連結仍可能含有原始空白。在繼續傳送連結前,請先將它們編碼。
- 非英文網域名稱。 這類網域使用另一套系統 punycode,編碼路徑或查詢並不會改變主機名稱。
- 半個表情符號。 損壞的複製內容可能留下單一的代理字元,它無法被編碼。工具會以替代字元取代,並告訴你它這麼做了。
- 連結中的 Base64。 連結中的 Base64 值遵循自己的規則,會用 - 和 _ 取代 + 和 /。請參閱Base64 說明。
用 fixmint 操作
- 把文字或連結貼到 文字或網址。
- 選擇 編碼 或 解碼,再選 組件(單一個值)或 整段網址。
- 若連結是從網頁表單複製的,勾選 將 + 視為空白(表單資料)。
- 若是連結,閱讀 解碼後的查詢參數 來查看每個名稱與值。
- 複製結果。
簡短解答
%20 是什麼意思?
一個空白。它的位元組值以十六進位表示為 20。
為什麼我的連結裡是 +,而不是 %20?
這個連結可能來自表單,而表單中 + 代表空白。「將 + 視為空白(表單資料)」選項可以將它解碼。
為什麼我的連結裡會出現 %2520?
這個值被編碼了兩次。%20 的百分號又被編碼成 %25。解碼一次可以回到 %20,再解碼一次就得到空白。
借助 AI 協助,由英文原文翻譯而成。
留言
還沒有留言,搶先留言吧。


