Base64 與 Base64URL
標準 Base64 用 + 和 / 兩個符號,但在網址裡它們有特殊意義,所以有了 Base64URL 變體:把 + 換成 -、/ 換成 _,結尾的 = 直接省略。JWT token 用的就是這個變體。
兩者可以互相轉換,但不能混用解碼器。用標準解碼器去解 Base64URL 字串,遇到 - 和 _ 就會報錯,選錯變體是常見的失敗原因。
十六進位與 URL 編碼
十六進位(Hex)把每個位元組寫成兩個 0–9a–f 字元,例如中文「中」會變成一串 hex。它的特色是固定膨脹一倍、可讀性高,常用在雜湊值、顏色碼、除錯輸出。
URL 編碼(百分號編碼)則是把特殊字元寫成 %XX,例如空格變 %20。它只處理「有問題的字元」、不動普通字母,所以網址裡的中文字常看到這種形式。跟 Base64 的用途完全不同。
UTF-8:編碼之前的編碼
在做 Base64 之前,文字要先變成位元組,這一步用的就是字元集,最常見的是 UTF-8。同一個中文字,用 UTF-8 和用 Big5 轉出的位元組不同,Base64 結果也會完全不同。
所以「Base64 解出來是亂碼」時,兇手往往是字元集而不是 Base64。先對齊字元集,再談編碼,順序別搞反。
常見問題
看到一串很長的英數字,怎麼判斷是哪種編碼?
看字元組成:只有 0–9a–f 是十六進位;有 +/= 結尾可能是標準 Base64;有 -_ 沒 = 可能是 Base64URL;有 %XX 的是 URL 編碼。再看長度與上下文輔助判斷。
Base64URL 和標準 Base64 能混用嗎?
不行直接混用,但轉換很簡單:把 -_ 換回 +/,再把長度補到 4 的倍數加上 =,就是標準 Base64。很多函式庫兩種都支援,選對參數即可。
為什麼雜湊值常用十六進位而不用 Base64?
十六進位固定膨脹一倍、字元最單純(只有 0–9a–f),在各種系統裡都不會被轉義,可讀性和相容性最好。Base64 雖然短,但 +/= 在某些場合是麻煩。