Base64 編碼:文字和檔案轉 Base64

把文字、原始位元組或任意檔案轉換為 Base64。可以按接收方的要求選擇字元集,保留或去掉 = 填充,並按 MIME 或 PEM 格式每 76 或 64 個字元換行。

完全在瀏覽器中執行,不會上傳任何資料。

使用方法

  1. 輸入或貼上要編碼的文字;如需編碼原始位元組,可將輸入切換為十六進位;也可以點選「開啟檔案」編碼檔案。
  2. 除非接收方要求其他字元集,否則「文字編碼」保持預設的 UTF-8 即可。
  3. 設定選項:大多數場景使用「標準」變體;接收方不需要填充時關閉「填充」;需要時選擇每 76 個字元(MIME)或 64 個字元(PEM)換行。
  4. 複製 Base64 結果,或將其下載為檔案。

Base64 編碼的原理

編碼器每次讀取 3 個位元組,把這 24 位拆成 4 組,每組 6 位。每個 6 位數值(0 到 63)對應一個字元:0 到 25 是 A-Z,26 到 51 是 a-z,52 到 61 是 0-9,最後兩個是 + 和 /。輸入 3 個位元組,輸出 4 個字元,所以 Base64 結果比原始資料大約多出 33%。

文字     M        a        n
位元組     77       97       110
二進位   01001101 01100001 01101110
6 位分組 010011 010110 000101 101110
索引     19     22     5      46
Base64   T      W      F      u

填充與輸出長度

如果輸入長度不是 3 的整數倍,最後一組就不完整:剩 1 個位元組時輸出 2 個字元加 ==,剩 2 個位元組時輸出 3 個字元加一個 =。因此,帶填充的輸出長度總是 4 × ceil(n / 3),其中 n 是輸入的位元組數。

填充本身不攜帶任何資料。JSON Web Token、URL 參數和許多 API 都不使用填充,如果接收方要求無填充的結果,關閉「填充」即可。用於連結或檔名時,請選擇 URL 安全變體,或直接使用 Base64URL 頁面,它會用 - 和 _ 代替 + 和 /。

MIME 與 PEM 的換行

預設輸出是一整行,這正是 JSON、Data URI 和 HTTP 頭所需要的格式。但有兩種格式要求換行:

  • MIME,每行 76 個字元。使用 Content-Transfer-Encoding: base64 傳送的郵件附件,每行不得超過 76 個字元(RFC 2045)。該選項按 MIME 的要求使用 CRLF 換行。
  • PEM,每行 64 個字元。位於 -----BEGIN 和 -----END 之間的證書和金鑰採用每行 64 個字元的格式(RFC 7468)。該選項使用 LF 換行。

字元集與檔案

Base64 編碼的物件是位元組而不是文字,所以文字要先按某種字元集轉換成位元組。比如字母 é 在 UTF-8 中佔 2 個位元組,在 ISO-8859-1 或 Windows-1252 中只佔 1 個位元組,同樣的文字就會得到不同的 Base64。網頁、JSON 和幾乎所有現代 API 都應使用 UTF-8;只有在對接舊系統時,才需要選擇 GBK、Shift_JIS、Windows-1251 等字元集。

檔案會按原始位元組編碼,不做任何字元集轉換。如果需要帶 HTML 和 CSS 程式碼片段的圖片編碼,請使用 圖片轉 Base64;如果需要帶有自動識別 MIME 型別的 Data URI,請使用 檔案轉 Base64。

編碼規格

字母表A-Z a-z 0-9 + /
輸出體積每 3 位元組輸出 4 個字元(約 133%)
填充用 = 補足到 4 的倍數
標準RFC 4648 第 4 節
區分大小寫是

編碼範例

輸入 (UTF-8)輸出
Hello, World!SGVsbG8sIFdvcmxkIQ==
Base64.isQmFzZTY0Lmlz
你好5L2g5aW9

常見問題

為什麼我的 Base64 結果和其他工具不一樣?
幾乎都是因為輸入的位元組不同。常見原因有:末尾多了換行符(命令列的 echo 會自動新增,可改用 printf '%s' 或 echo -n)、字元集不同、文字中帶有 Windows 換行符,或者填充、字母表、換行設定不同。相同的位元組配合相同的選項,結果一定相同。
在 JavaScript 中如何對中文等 Unicode 文字進行 Base64 編碼?
btoa() 只接受 U+00FF 以內的字元,遇到中文會直接報錯。需要先轉換為 UTF-8 位元組,例如 btoa(String.fromCharCode(...new TextEncoder().encode(str)))。在 Node.js 中可以使用 Buffer.from(str, 'utf8').toString('base64')。
如何在命令列中進行 Base64 編碼?
在 Linux 或 macOS 上執行 printf '%s' '你的文字' | base64。GNU base64 預設每 76 個字元換行(加 -w 0 輸出單行),openssl base64 預設每 64 個字元換行(加 -A 輸出單行)。
Base64 編碼算是加密嗎?
不算。Base64 沒有金鑰,任何人都可以用 Base64 解碼 工具還原。它的作用是讓二進位資料通過只支援文字的渠道傳輸,而不是隱藏資訊。
Base64 編碼後資料會變大多少?

每 3 個位元組變成 4 個字元,最後不足一組時補齊,因此輸出大約比原資料大 33%。如果按 MIME 換行,每 76 個字元還會再多出 2 個位元組(CRLF)。