Uncaught DOMException: String contains an invalid character

Base64, btoa(), wie man in JavaScript die Zeichenkodierung ausschaltet

Zeichenketten und Binary-Strings

JavaScript arbeitet mit Kodierten Zeichenketten. Ein Versuch btoa('€') wirft eine Exception (s.o.), weil das Eurozeichen eben eine kodierte Zeichenkette ist. Damit die Base64-Kodierung funktioniert, muß man diese Zeichenkette in einen Binary-String umwandeln, also die Zeichenkodierung ausschalten. Hierzu gibt es 2 Möglichkeiten.

Über einen Blob und diesen als BinaryString lesen

bb = new Blob(['€']);
fr = new FileReader();
fr.onload = function(){
    console.log( btoa(this.result) ); // 4oKs
};
fr.readAsBinaryString(bb);

Vermittels TextEncoder bzw. TextDecoder

Zunächst erstellen wir uns eine eigene Klasse zum delegieren der Methoden:

// Eigene Klasse delegiert Methoden
// für TextEncode() und TextDecode()
function Encode(){
    this.enc = new TextEncoder();
    this.dec = new TextDecoder();
    this.encode = function(ustr){
        return this.enc.encode(ustr);
    };
    this.decode = function(uha){
        return this.dec.decode(uha);
    };
}

Das macht die Anwendung recht einfach:

encoder = new Encode();
uha = encoder.encode('€'); // Uint8-Array
console.log( btoa( String.fromCharCode(...uha) ) ); 
    // Spread-Syntax
    // Ergebnis 4oKs

Datenschutzerklärung: Diese Seite dient rein privaten Zwecken. Auf den für diese Domäne installierten Seiten werden grundsätzlich keine personenbezogenen Daten erhoben. Das Loggen der Zugriffe mit Ihrer Remote Adresse erfolgt beim Provider soweit das technisch erforderlich ist. s​os­@rolf­rost.de.