Die atob()-Funktion von JavaScript dient zum Dekodieren von Base64-kodierten Zeichenfolgen. Benutzer können beim Dekodieren von UTF-8-kodierten Zeichenfolgen auf Probleme stoßen, was zu ASCII-kodierten Zeichen anstelle der korrekten UTF-8-Darstellung führt.
Base64 erwartet Binärdaten als Eingabe , und JavaScript betrachtet Zeichenfolgen, deren Zeichen ein Byte belegen, als Binärdaten. Zeichen, die in UTF-8-codierten Zeichenfolgen mehr als ein Byte belegen, lösen jedoch Ausnahmen während der Codierung aus.
Die empfohlene Lösung besteht darin, binäre Zeichenfolgen zu codieren und zu decodieren:
Kodierung von UTF-8 in Binärfunktion
function toBinary(string) { const codeUnits = new Uint16Array(string.length); for (let i = 0; iBinär nach UTF-8 dekodieren
function fromBinary(encoded) { const binary = atob(encoded); const bytes = new Uint8Array(binary.length); for (let i = 0; iDiese Lösung konvertiert die ursprüngliche UTF-8-Zeichenfolge in eine binäre Darstellung und behält dabei die UTF-16-Kodierung, eine native Darstellung in JavaScript, bei.
Lösung 2: ASCII Base64-Interoperabilität
Eine alternative Lösung, die sich auf die UTF-8-Interoperabilität konzentriert, besteht darin, Klartext base64 beizubehalten strings:
Codierung von UTF-8 in Base64
function b64EncodeUnicode(str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) { return String.fromCharCode('0x' p1); })); }Base64 in UTF-8 dekodieren
function b64DecodeUnicode(str) { return decodeURIComponent(atob(str).split('').map(function(c) { return '%' ('00' c.charCodeAt(0).toString(16)).slice(-2); }).join('')); }Diese Lösung verarbeitet UTF-8-codierte Zeichenfolgen effizient, ohne ihre Darstellung zu ändern.
TypeScript-Unterstützung
// 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('')) }Historische Lösung (veraltet)
function utf8_to_b64( str ) { return window.btoa(unescape(encodeURIComponent( str ))); } function b64_to_utf8( str ) { return decodeURIComponent(escape(window.atob( str ))); }Obwohl dieser Ansatz noch funktionsfähig ist, ist er in modernen Browsern mittlerweile veraltet.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3