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.
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.
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. sos@rolfrost.de.