Ich habe festgestellt, dass obwohl die Abstandshalter aus den oben genannten Antworten funktionierten, sie nicht dem Verhalten der Implementierungen von btoa()
und atob()
für Desktop-Browser entsprachen:
const btoa = function(str){ return Buffer.from(str).toString('base64'); }
// gibt "4pyT" zurück, aber in Desktop-Chrome würde es einen Fehler auslösen.
btoa('');
// gibt "fsO1w6bCvA==", aber in Desktop-Chrome würde es "fvXmvA==" zurückgeben
btoa(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));
Es stellt sich heraus, dass Buffer
-Instanzen standardmäßig in UTF-8 kodierten Zeichenfolgen repräsentieren/interpretieren. Im Gegensatz dazu können Sie in Desktop-Chrome nicht einmal eine Zeichenfolge eingeben, die Zeichen außerhalb des lateinischen Bereichs enthält, in btoa()
, da es eine Ausnahme auslösen wird: Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.
Daher müssen Sie den Codierungstyp explizit auf latin1
setzen, damit Ihr Node.js-Abstandshalter mit dem Codierungstyp von Desktop-Chrome übereinstimmt:
const btoaLatin1 = function(str) { return Buffer.from(str, 'latin1').toString('base64'); }
const atobLatin1 = function(b64Encoded) {return Buffer.from(b64Encoded, 'base64').toString('latin1');}
const btoaUTF8 = function(str) { return Buffer.from(str, 'utf8').toString('base64'); }
const atobUTF8 = function(b64Encoded) {return Buffer.from(b64Encoded, 'base64').toString('utf8');}
btoaLatin1(''); // gibt "Ew==" zurück (es wäre besser, wenn es einen Fehler auslösen würde, da dies nicht dekodierbar ist)
atobLatin1(btoa('')); // gibt "\u0019" zurück (END OF MEDIUM)
btoaUTF8(''); // gibt "4pyT" zurück
atobUTF8(btoa('')); // gibt ""
// gibt "fvXmvA==" zurück, genau wie in Desktop-Chrome
btoaLatin1(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));
// gibt "fsO1w6bCvA==" zurück
btoaUTF8(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));