
有時文本裡包含一些不可列印的符号,而你需要把它們傳輸到伺服器,這時我們會需要用到Base64編碼。或者你需要把一個圖檔内容以文本格式嵌入到網頁中,這時你也會用到 Base64 編碼。
所謂 Base64 是一種基于64個可列印字元來表示二進制資料的方法,這些可列印字元包括字母 A-Z,a-z,數字0-9,+和/。此外等号=用作字尾用途。需要注意它的主要作用并非加密,而是編碼資料友善傳輸。
為了讨論友善,本文将主要探讨在JavaScript中如何實作字元串的Base64編碼和解碼。
如果你經曆過IE 6-9的“黑暗”時代,一定會覺得實作Base64編碼/解碼很繁瑣。HTML 5的出現解救了我們,浏覽器紛紛内置了原生的方法來支援這個功能:
btoa() – 根據提供的二進制字元串生成Base64編碼後的ASCII字元串atob() – 解碼btoa()生成的字元串
看起來很完美,不過在處理非ASCII字元時會報錯,如下截圖來自Chrome 83開發者工具:
原因
根據設計,Base64會以二進制資料作為處理對象。對于JavaScript字元串來說,這意味着其中的每個字元隻能占用一個位元組。如果調用btoa()時傳入的字元串包含了占用多個位元組的字元,那麼會報錯,因為這個字元串被認定為非二進制資料:
解決方案
1.轉義所有擴充字元(不建議)
這個方案用了 escape 和 unescape,以及encodeURIComponent和decodeURIComponent來輔助編碼/解碼字元串。
由于escape()和unescape()函數已被廢棄,雖然浏覽器目前仍支援,不建議使用此方案。
2.在編碼之前轉義字元串(建議)
此方案用了正規表達式比對替換功能
要解碼Base64字元串,需要這樣做:
總結
Base64是一種廣泛使用的編碼方案,用于在網絡上以ASCII字元流的形式安全傳輸二進制資料。
本文介紹了如何對JavaScript的UTF8編碼的字元串進行編碼和解碼,特别是如何處理非ASCII字元。
當然,你仍然可以選擇通過網絡發送二進制資料。但有時這也有風險,因為并非所有的應用程式和網絡通信裝置都能處理原始二進制資料。而對于大多數應用程式來說,ASCII字元集非常容易處理。