JavaScript 的 atob() 函數旨在解碼 Base64 編碼的字串。使用者在解碼 UTF-8 編碼字串時可能會遇到問題,導致產生 ASCII 編碼字元而不是正確的 UTF-8 表示形式。
Base64 需要二進位資料作為輸入,JavaScript將字元佔據一個位元組的字串視為二進位資料。然而,在 UTF-8 編碼字串中佔用超過 1 個位元組的字元在編碼過程中會觸發異常。
建議的修復方法是編碼和解碼二進位字串:
將UTF-8 編碼為二進位
function toBinary(string) { const codeUnits = new Uint16Array(string.length); for (let i = 0; i < codeUnits.length; i++) { codeUnits[i] = string.charCodeAt(i); } return btoa(String.fromCharCode(...new Uint8Array(codeUnits.buffer))); }
將二進位解碼為UTF-8
function fromBinary(encoded) { const binary = atob(encoded); const bytes = new Uint8Array(binary.length); for (let i = 0; i < bytes.length; i++) { bytes[i] = binary.charCodeAt(i); } return String.fromCharCode(...new Uint16Array(bytes.buffer)); }
此解決方案將原始UTF-8 字串轉換為二進位表示形式,保留UTF-16 編碼(JavaScript 中的本機表示形式)。
專注於UTF-8 互通性的替代解決方案是維護明文base64字串:
將維護明文base64字串:
function b64EncodeUnicode(str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) { return String.fromCharCode('0x' + p1); })); }將維護明文base64字串:
將維護明文base64字串:
function b64DecodeUnicode(str) { return decodeURIComponent(atob(str).split('').map(function(c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2); }).join('')); }
將UTF-8編碼為Base64
// Encoding UTF-8 ⇢ base64 function b64EncodeUnicode(str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) { return String.fromCharCode(parseInt(p1, 16)) })) } // Decoding base64 ⇢ UTF-8 function b64DecodeUnicode(str) { return decodeURIComponent(Array.prototype.map.call(atob(str), function(c) { return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2) }).join('')) }
function utf8_to_b64( str ) { return window.btoa(unescape(encodeURIComponent( str ))); } function b64_to_utf8( str ) { return decodeURIComponent(escape(window.atob( str ))); }此解決方案可有效處理UTF-8 編碼字串,而不改變其表示形式。 TypeScript 支援歷史解決方案(已棄用)雖然仍然有效,但這種方法現在在現代瀏覽器中已被棄用。
以上是如何在處理 UTF-8 編碼的同時在 JavaScript 中解碼 Base64 字串?的詳細內容。更多資訊請關注PHP中文網其他相關文章!