將 UTF-8 轉換為 Base64URL 只需 4 步:(1)將文字編碼為 UTF-8 位元組,(2)套用標準 Base64 編碼,(3)將 + 替換為 -,將 / 替換為 _,(4)去除結尾的 = 填充。這樣就能產生符合 RFC 4648 標準的URL 安全字串,廣泛用於 JWT 和 API 請求頭。
標準 Base64 與 Base64URL 的差異
| 字元 | 標準 Base64 | Base64URL | 原因 |
|---|---|---|---|
| 第 62 個字元 | + |
- |
+ 在 URL 中表示空格 |
| 第 63 個字元 | / |
_ |
/ 在 URL 中是路徑分隔符 |
| 填充 | = 必填 |
省略 | = 在 URL 中會變成 %3D |
| URL 安全 | 否 | 是 | 可直接用於查詢字串和檔案名稱 |
根據 RFC 4648 §5,這種「URL 與檔案名稱安全字母表」確保了跨系統的相容性。

4 步轉換流程
| 步驟 | 操作 | 範例(“Hello”) |
|---|---|---|
| 1 | UTF-8 文字 → 位元組 | H e l l o → 位元組陣列 |
| 2 | 位元組 → 標準 Base64 | SGVsbG8= |
| 3 | 將 + 替換為 -,/ 替換為 _ |
此處無需變更 |
| 4 | 去除結尾的 = 填充 |
SGVsbG8 |
根據 維基百科,Base64 編碼會使資料大小增加約 33%。

Unicode 與 Emoji 處理
根據 NextUtils 的說明,Base64 是編碼而非加密——它只是將資料透過純文字通道傳輸。為了避免出現亂碼(「Mojibake」),務必先使用 TextEncoder 將文字轉換為 UTF-8 位元組。
| 輸入 | 不使用 TextEncoder | 使用 TextEncoder |
|---|---|---|
Hello 世界! 🌍 |
亂碼 / TypeError | 正確的 Base64URL |
程式碼範例
JavaScript(瀏覽器)— Unicode 安全
function toBase64Url(str) {
const bytes = new TextEncoder().encode(str);
const base64 = btoa(String.fromCharCode(...bytes));
return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}
Python 3 — 標準函式庫
根據 AskPython 的說明:
import base64
data = "Hello 世界! 🌍"
encoded = base64.urlsafe_b64encode(data.encode('utf-8')).decode('utf-8').rstrip('=')
print(encoded)
Node.js — Buffer 轉換
const str = "API_Payload_Data";
const base64url = Buffer.from(str, 'utf8')
.toString('base64')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
故障排除:填充錯誤
| 錯誤 | 原因 | 解決方法 |
|---|---|---|
binascii.Error: Incorrect padding |
缺少 = 填充 |
加入 = 直到長度為 4 的倍數 |
atob() 拋出 TypeError |
包含非 ASCII 字元 | 先使用 TextEncoder |
| 輸出亂碼 | 跳過了 UTF-8 編碼 | 一律先編碼為位元組再進行 Base64 |
根據 AskPython,計算缺少的填充量:padding_needed = (4 - len(data) % 4) % 4,然後附加對應數量的 = 字元。
應用場景:JWT 與 Data URI
JWT(JSON Web Token)結構
| 部分 | 內容 | 編碼方式 |
|---|---|---|
| 標頭(Header) | 演算法 + Token 類型 | Base64URL |
| 承載(Payload) | 宣告(使用者資料、過期時間) | Base64URL |
| 簽章(Signature) | HMAC 或 RSA 簽章 | Base64URL |
JWT 通常以 eyJ 開頭——這是 {(JSON 左花括號)的 Base64URL 編碼。

不同場景下的 Base64 與 Base64URL 選擇
| 應用場景 | 編碼方式 | 填充 |
|---|---|---|
| JWT Token | Base64URL | 省略 |
| Data URI(嵌入圖片) | 標準 Base64 | 必填 |
| HTTP Basic 認證 | 標準 Base64 | 必填 |
| URL 查詢參數 | Base64URL | 省略 |
總結
4 步流程:UTF-8 位元組 → Base64 → 將 +/ 替換為 -_ → 去除填充。JavaScript 中使用 TextEncoder,Python 中使用 base64.urlsafe_b64encode(),Node.js 中使用 Buffer。遵循 RFC 4648 以確保跨系統相容性。Base64URL 是編碼而非加密——如需安全保障,請使用 AES-256 或 TLS。
常見問題
Base64URL 和加密是一回事嗎?
不是。Base64URL 是可逆編碼——任何人都可以在沒有金鑰的情況下解碼。請使用 AES-256 或 TLS/SSL 來保護敏感資料。
為什麼 Base64URL 在標準 Base64 解碼器中會失敗?
標準解碼器期望 +、/ 和 = 填充。Base64URL 使用 -、_ 並省略填充。解碼前需要先還原字元替換並恢復填充。
為什麼 JWT 中省略了填充?
= 字元在 URL 中會變成 %3D,讓字串更長且更難閱讀。RFC 4648 允許省略填充,因為解碼器可以在沒有填充標記的情況下重建原始長度。

發佈留言