跳到主要內容

開發者工具 / 035

Base64 編碼解碼

文字與 Base64 雙向編碼解碼,支援 UTF‑8 中文、emoji 與 Base64URL 格式。

結果

 

JavaScript 原生的 btoa() 只吃 Latin-1, 直接餵中文或 emoji 會丟 InvalidCharacterError。 這個工具先用 TextEncoder 轉成 UTF-8 位元組再編碼, 所以中文、日文、emoji 都能正確處理。

為什麼做這個

Base64 本身不難,但瀏覽器原生 btoa() 不能直接處理所有 Unicode 文字。這個工具先以 UTF‑8 處理字串,也支援網址與 JWT 常用的 Base64URL 變體。

這個工具怎麼用

選好方向、貼上內容就會立即轉換,不需要按送出。編碼支援任何 Unicode 字元;解碼時空白與換行會自動忽略,所以從郵件或設定檔複製過來的多行 Base64 可以直接貼。

中文能不能正確編碼是這個工具的重點。 JavaScript 原生的 `btoa()` 只接受 Latin-1 範圍的字元,直接餵中文會丟 `InvalidCharacterError`。正確做法是先用 `TextEncoder` 把字串轉成 UTF-8 位元組,再逐位元組組成二進位字串交給 `btoa()`。很多線上工具沒處理這一步,中文編出來就是壞的。

Base64URL 是給網址與 JWT 用的變體(RFC 4648 §5)。標準 Base64 會產生 `+`、`/`、`=` 三個字元,它們在網址裡都有特殊意義,所以 Base64URL 把 `+` 換成 `-`、`/` 換成 `_`,並去掉結尾的 `=`。解碼時這個工具兩種都認得,也會自動把 padding 補回來。

解碼失敗通常是兩個原因:內容不是合法的 Base64(有非法字元或長度不對),或是解出來的位元組不構成合法的 UTF-8。後者代表原始資料可能是圖片、壓縮檔這類二進位內容,那沒辦法用文字顯示。

實際看幾個例子比較容易理解規則:英文 `Man` 編成 `TWFu`,`Ma` 編成 `TWE=`,`M` 編成 `TQ==`——每 3 個位元組變成 4 個字元,不足 3 個位元組時用 `=` 補滿,所以結尾的 `=` 最多出現兩個。中文 `你好` 會先變成 6 個 UTF-8 位元組(E4 BD A0 E5 A5 BD),再編成 `5L2g5aW9`。位元組 FB FF 在標準 Base64 是 `+/8=`,在 Base64URL 則是 `-_8`,可以拿來確認兩種模式的差別。

Base64 常見的用途有四個:把小圖內嵌成 Data URI(`data:image/png;base64,…`)、HTTP Basic 驗證標頭(把 `帳號:密碼` 編碼後放進 Authorization,同樣不是加密)、電子郵件的 MIME 附件(每行約 76 字元換行,所以解碼時要忽略換行)、以及 JWT 等各種 token。排查問題時先判斷內容用的是標準還是 URL 安全版本,大多數「解不開」的狀況都出在這裡。

常見問題

為什麼別的工具編中文會變亂碼?

因為它們直接呼叫 `btoa()`。那個函式只吃 Latin-1,遇到超出範圍的字元有些實作會丟錯、有些會截斷高位元組,結果就是亂碼。正確做法是先轉成 UTF-8 位元組再編碼,這個工具就是這樣做的。

Base64 跟 Base64URL 差在哪?

差三個字元。標準 Base64 用 `+` 與 `/`,結尾補 `=`;Base64URL 把它們換成 `-` 與 `_` 並省略 `=`,因為那三個字元在網址與檔名裡都有特殊意義。JWT 的三段用的都是 Base64URL。

Base64 是加密嗎?

不是。它只是把二進位資料換成可列印字元的編碼方式,任何人都能直接解回原文,沒有任何保密效果。用它來「藏」密碼或金鑰等於沒有保護——要保密請用真正的加密。

為什麼編碼後變長了?

Base64 用 4 個字元表示 3 個位元組,所以體積會膨脹約 33%。這是編碼方式的必然結果,不是工具的問題。把圖片以 Data URI 內嵌進 HTML/CSS 時要考慮這個成本。

可以處理圖片或檔案嗎?

目前只做文字。二進位檔案編碼後可以貼進來,但解碼結果如果不是合法的 UTF-8 文字就無法顯示,工具會提示解碼失敗。

Base64 結尾的 = 是什麼?

那是補位(padding)。Base64 以 3 個位元組為一組、編成 4 個字元,原始資料長度不是 3 的倍數時,用 `=` 把最後一組補滿到 4 個字元:多 1 個位元組補 2 個 `=`,多 2 個位元組補 1 個。Base64URL 通常會省略它,本工具解碼時會自動補回。

解碼出來為什麼是亂碼或問號?

因為原始資料不是 UTF-8 文字。可能是 Big5 等舊編碼的文字、圖片、壓縮檔或其他二進位內容。Base64 只負責把位元組換成可列印字元,不保證位元組本身是文字。