使用方法
- 輸入或貼上要編碼的文字;如需編碼原始位元組,可將輸入切換為十六進位;也可以點選「開啟檔案」編碼檔案。
- 除非接收方要求其他字元集,否則「文字編碼」保持預設的 UTF-8 即可。
- 設定選項:大多數場景使用「標準」變體;接收方不需要填充時關閉「填充」;需要時選擇每 76 個字元(MIME)或 64 個字元(PEM)換行。
- 複製 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.is | QmFzZTY0Lmlz |
你好 | 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 編碼?
printf '%s' '你的文字' | base64。GNU base64 預設每 76 個字元換行(加 -w 0 輸出單行),openssl base64 預設每 64 個字元換行(加 -A 輸出單行)。Base64 編碼算是加密嗎?
Base64 編碼後資料會變大多少?
每 3 個位元組變成 4 個字元,最後不足一組時補齊,因此輸出大約比原資料大 33%。如果按 MIME 換行,每 76 個字元還會再多出 2 個位元組(CRLF)。