Ich stellte fest, dass die Shims aus den obigen Antworten zwar funktionierten, jedoch nicht mit dem Verhalten der Implementierungen von btoa()und durch Desktop-Browser übereinstimmten atob():
const btoa = function(str){ return Buffer.from(str).toString('base64'); }
// returns "4pyT", yet in desktop Chrome would throw an error.
btoa('✓');
// returns "fsO1w6bCvA==", yet in desktop Chrome would return "fvXmvA=="
btoa(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));
Wie sich herausstellt, Bufferrepräsentieren / interpretieren Instanzen Zeichenfolgen, die standardmäßig in UTF-8 codiert sind . Im Gegensatz dazu können Sie in Desktop-Chrome nicht einmal eine Zeichenfolge eingeben, die Zeichen außerhalb des Bereichs latin1 enthält btoa(), da dies eine Ausnahme auslöst :Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.
Daher müssen Sie explizit den eingestellten Codierungstyp an latin1, um für Ihre Node.js Shim die Codierung Art von Desktop - Chrome zum Spiel:
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('✓'); // returns "Ew==" (would be preferable for it to throw error because this is undecodable)
atobLatin1(btoa('✓')); // returns "\u0019" (END OF MEDIUM)
btoaUTF8('✓'); // returns "4pyT"
atobUTF8(btoa('✓')); // returns "✓"
// returns "fvXmvA==", just like desktop Chrome
btoaLatin1(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));
// returns "fsO1w6bCvA=="
btoaUTF8(String.fromCharCode.apply(null, new Uint8Array([0x7e, 0xf5, 0xe6, 0xbc])));