E se il dato binario in realtà fosse una stringa? Ad esempio, se ricevessimo un file contente dati testuali.
L’oggetto integrato TextDecoder, dato il buffer e l’encoding, ci consente di leggere il valore come se fosse una stringa JavaScript.
Come prima cosa dobbiamo crearlo:
let decoder = new TextDecoder([label], [options]);
label
, l’encoding di default èutf-8
, ma sono supportati anchebig5
,windows-1251
e molti altri.options
, oggetto opzionale:fatal
, boolean, se valetrue
allora verrà generata un’eccezione per i caratteri invalidi (non-decodificabili), altrimenti (default) verranno rimpiazzati con il carattere\uFFFD
.ignoreBOM
, boolean, se valetrue
allora ignora BOM (un marcatore opzionale di byte-order Unicode), raramente utilizzato.
…E successivamente decodificare:
let str = decoder.decode([input], [options]);
input
, ilBufferSource
da decodificare.options
, oggetto opzionale:stream
,true
per la decodifica di stream, quandodecoder
viene invocato ripetutamente con blocchi di dati in arrivo. In questo caso un carattere multi-byte potrebbe venir diviso in blocchi. Questa opzione dice alTextDecoder
di memorizzare i caratteri “incompleti” e di decodificarli all’arrivo del prossimo blocco.
Ad esempio:
let uint8Array = new Uint8Array([72, 101, 108, 108, 111]);
alert( new TextDecoder().decode(uint8Array) ); // Hello
let uint8Array = new Uint8Array([228, 189, 160, 229, 165, 189]);
alert( new TextDecoder().decode(uint8Array) ); // 你好
Possiamo decodificare una parte del buffer creando un visualizzatore su un suo sotto-array:
let uint8Array = new Uint8Array([0, 72, 101, 108, 108, 111, 0]);
// la stringa sta al centro
// ne crea un nuovo visualizzatore, senza copiare nulla
let binaryString = uint8Array.subarray(1, -1);
alert( new TextDecoder().decode(binaryString) ); // Hello
TextEncoder
TextEncoder fa esattamente l’operazione inversa, converte stringe in byte.
La sintassi è:
let encoder = new TextEncoder();
L’unica codifica che supporta è “utf-8”.
Mette a disposizione due metodi:
encode(str)
, ritornaUint8Array
partendo da una stringa.encodeInto(str, destination)
, esegue l’encode distr
indestination
il quale deve essere unUint8Array
.
let encoder = new TextEncoder();
let uint8Array = encoder.encode("Hello");
alert(uint8Array); // 72,101,108,108,111
Commenti
<code>
, per molte righe – includile nel tag<pre>
, per più di 10 righe – utilizza una sandbox (plnkr, jsbin, codepen…)