Base64 完整解說:為何會變大,以及如何解碼
Base64 用 64 個字元把二進位資料寫成純文字,這 64 個字元是 A 到 Z、a 到 z、0 到 9,再加上 + 和 /。每三個位元組會變成四個字元,所以文字會比它所包含的資料長約三分之一。當格式只接受文字時就會用到它,例如網頁中的資料 URL、JSON 欄位或電子郵件附件。
文字格式為何需要它
許多格式原本就只為文字設計。電子郵件內文、JSON 檔案和 CSS 檔案可以安全地存放字母與符號,但原始的圖片或 zip 檔含有某些系統可能會改寫、截斷或誤讀為控制碼的位元組值。Base64 只使用每個文字系統都會原樣傳遞的字元,因此資料能完整送達。它定義於 RFC 4648。
Base64 是一種編碼,不是加密。任何人都能不用金鑰解碼,因此絕對不能用它來隱藏密碼或個人資料。
三個位元組如何變成四個字元
以「Man」三個字母為例,它是三個位元組,十進位值分別為 77、97 和 110。這三個位元組合起來是 24 個位元。把這 24 個位元切成四組,每組六個位元,每一組就是 0 到 63 之間的數字,對應字母表中的一個字元。「Man」因此變成 TWFu。
六個位元只能表示 64 種值,所以四個字元只能承載三個位元組。因此在加入任何換行之前,輸出大約會比輸入大三分之一。
當資料無法被三個位元組整除時,編碼器會在結尾補上 = 號。「Ma」是兩個位元組,會變成 TWE=;「M」是一個位元組,會變成 TQ==。補上的符號告訴解碼器最後一組包含幾個位元組。
文字必須先以 UTF-8 編碼
Base64 處理的是位元組,而文字是由字元組成。像 é 或 ✓ 這樣的字元,在網路上通用的 UTF-8 編碼中會佔用不只一個位元組。瀏覽器的 btoa() 函式接受字串,並把每個字元當作一個位元組處理,因此遇到基本拉丁字母範圍以外的字元就會失敗。對勾符號 ✓ 一旦傳入,就會丟出 InvalidCharacterError。
解法是先把文字轉成 UTF-8 位元組,再對這些位元組進行編碼。片語 héllo ✓ 在 UTF-8 中是 10 個位元組,其 Base64 為 aMOpbGxvIOKckw==。Base64 工具會替你完成這個步驟。解碼時,它會以 UTF-8 把位元組讀回文字。若位元組不是有效的 UTF-8 文字,工具會將其視為檔案,並提供下載。
網址安全的 Base64
標準字母表包含 + 和 /。在網址中,+ 可能代表空白,/ 則用來分隔路徑的各個部分,因此 Base64 字串可能會破壞連結。網址安全格式(RFC 4648 第 5 節)改用 - 和 _,並通常省略 = 補位。當字串要放進網址、檔名或權杖時就使用它。解碼器兩種格式都接受,有無補位皆可。
如果 Base64 是從連結中取得的,請先解碼網址。連結中經過百分号編碼的值,必須先解碼才能讀取其 Base64 內容。百分號編碼指南說明了連結的相關規則。
最常見的情況是登入權杖:JSON Web Token 由三個以點號相連的 Base64url 部分組成,即標頭、資料與簽章。JWT 解碼器會把它拆開,並將標頭和資料以易讀的 JSON 顯示。
資料 URL 與圖片
資料 URL 會把檔案直接放進連結本身。其格式為 data:,接著是媒體類型,然後是 ;base64,再加上逗號與資料。一張小圖片會變成 data:image/png;base64,後面接著編碼後的位元組。網頁和樣式表都接受這種格式,對於微小的圖示來說,這樣可以省下一次請求。
代價是體積。資料會大約增加三分之一,而且它是嵌在頁面或樣式表中傳送,而不是瀏覽器可以快取的獨立檔案。資料 URL 適合小型圖片,不適合大型照片。如果照片很大,請在編碼前先壓縮照片。
在工具中解碼 Base64 時,它會檢查資料的前幾個位元組。PNG、JPEG、GIF 和 WebP 檔案各自以已知的檔頭開始,因此工具會顯示預覽並提供下載。媒體類型為圖片的資料 URL 也會以圖片形式顯示。
如何在 fixmint 中操作
- 在文字或 Base64 上方選擇編碼或解碼,然後貼上你的文字或 Base64。
- 若是用於權杖、檔名或連結,請勾選網址安全字母表,不含 = 補位。無論如何,解碼器兩種格式都接受。
- 若要從檔案產生資料 URL,請將檔案拖放到放置區,並勾選檔案:輸出 data: URL。
- 複製結果。若解碼後的位元組是檔案而非文字,請使用工具提供的下載。
常見的解碼錯誤
- 含有不允許的字元。 輸入中包含 64 個字元以外的字元,例如從複製的句子中帶入的引號。請檢查文字的來源。複製的文字中若含有零寬空格,也會產生同樣的錯誤,因此請移除隱藏字元後再試一次。隱藏字元指南說明了它們的來源。
- 長度不正確。 缺少或多出了一個字元,通常代表複製時內容被截斷。
- 換行與空白。 電子郵件(MIME)會每 76 個字元折行一次。解碼器會移除空白與換行,因此你可以直接貼上折行過的文字。
- 缺少補位。 有些系統會省略 = 號,解碼器會自動補回。
特殊情況
- 解碼結果看起來像亂碼。 它可能是檔案而非文字。zip 檔、PDF 或程式解碼後的位元組無法被讀為文字。工具會將這些結果提供為下載。
- 非常大的輸入。 編碼或解碼時,整個檔案都會保存在瀏覽器中,因此非常大的檔案可能會很慢,在手機上甚至可能失敗。
快速解答
Base64 和加密是一樣的嗎?
不是。它是一種可逆的編碼,沒有金鑰,任何人都能解碼。
為什麼我的 Base64 比檔案還長?
每三個位元組會變成四個字元,因此文字大約會大三分之一。
為什麼複製的 Base64 字串無法解碼?
通常是複製時遺失或多出了一個字元,例如換行位置錯誤,或少了最後一個字元。請從來源重新複製。
借助 AI 協助,由英文原文翻譯而成。
留言
還沒有留言,搶先留言吧。


