JavaScript BinaryString, String, Base64 und Zeichenkette

Wie JavaScript intern zwischen String und BinaryString unterscheidet

JavaScript unterscheidet, ähnlich wie Perl, intern zwischen Zeichenketten und Bytesequenzen. Tabelle und Code untenstehend verdeutlichen diesen Sachverhalt. Ausgehend von den Zeichen 'äöü' die hierzu UTF-8 kodiert vorliegen, werden diese einmal als Zeichenkette (String) und zum Anderen als Bytesequenz (BinaryString) innerhalb JavaScript aufgefasst.

So liefert die JavaScript-Funktion charCodeAt() im ersten Fall den Codepoint für das jeweilige Zeichen, im zweiten Fall jedoch die Bytewertigkeit der jeweiligen Oktette (Byte).

äöü als String und als BinaryString
Copepoints in Zeichenkette
Bytewertigkeiten in BinaryString

Gut zu sehen also, daß der Index über einen BinaryString eben über die Bytes läuft, in einer Zeichenkette hingegen läuft der Index über die Zeichen.

Das dazugehörige JavaScript





Anmerkung: Die Funktion charCodeAt() liefert die Wertigkeiten beliebiger Bytes. Die Umkehrfunktion dazu ist String.fromCharCode(oktettenwertigkeit) womit genau ein Byte erzeugt wird.

Die hier vorgestellete Funktion zstr2bstr(str) geht auf eine Empfehlung von MDN zurück, Link siehe obenstehend und funktioniert nur mit UTF-kodierten Zeichenketten was dem Einsatz von encodeURIComponent(str) geschuldet ist und natürlich ist das mehr als ein Kompromiss.

Wenn die Datenquelle jedoch ein Blob ist, wird zweckmäßigerweise FileReader.readAsBinaryString() verwendet. Und schließlich lässt sich ein Binary String auch aus einem ArrayBuffer heraus erzeugen.

Base64

Die Builtin-Funktion window.btoa(str) funktioniert einwandfei wenn eine in str vorliegende Binary zu einem Binary String aufgearbeitet wurde. Hierzu eine erprobte Funktion, sie erzeugt aus einen ArrayBuffer eine Binary:

// Arraybuffer to BinaryString
function ab2str(ab){
    var dv = new DataView(ab);
    var offs = 0;
    var binstr = '';
    while (offs < dv.byteLength ){
        binstr += String.fromCharCode(dv.getUint8(offs));
        offs += 1;
    }
    return binstr;
}

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.