¿Qué pasa si los datos binarios son en realidad un string? Por ejemplo, recibimos un archivo con datos textuales.
El objeto incorporado TextDecoder nos permite leer el valor y convertirlo en un string de JavaScript, dados el búfer y la codificación.
Primero necesitamos crearlo:
let decoder = new TextDecoder([label], [options]);
label
– la codificación,utf-8
por defecto, perobig5
,windows-1251
y muchos otros también son soportados.options
– objeto opcional:fatal
– booleano, si estrue
arroja una excepción por caracteres inválidos (no-decodificable), de otra manera (por defecto) son reemplazados con el carácter\uFFFD
.ignoreBOM
– booleano, si estrue
entonces ignora BOM (una marca Unicode de orden de bytes opcional), raramente es necesario.
…Y luego decodificar:
let str = decoder.decode([input], [options]);
input
–BufferSource
para decodificar.options
– objeto opcional:stream
– true para decodificación de secuencias, cuando eldecoder
es usado repetidamente para fragmentos de datos entrantes. En ese caso, un carácter de varios bytes puede ocasionalmente dividirse entre fragmentos. Esta opción le dice alTextDecoder
que memorice caracteres “incompletos” y que los decodifique cuando venga el siguiente fragmento.
Por ejemplo:
let uint8Array = new Uint8Array([72, 111, 108, 97]);
alert( new TextDecoder().decode(uint8Array) ); // Hola
let uint8Array = new Uint8Array([228, 189, 160, 229, 165, 189]);
alert( new TextDecoder().decode(uint8Array) ); // 你好
Podemos decodificar una parte del búfer al crear una vista de sub arreglo para ello:
let uint8Array = new Uint8Array([0, 72, 111, 108, 97, 0]);
// El string esta en medio
// crear una nueva vista sobre el string, sin copiar nada
let binaryString = uint8Array.subarray(1, -1);
alert( new TextDecoder().decode(binaryString) ); // Hola
TextEncoder
TextEncoder hace lo contrario: convierte un string en bytes.
La sintaxis es:
let encoder = new TextEncoder();
La única codificación que soporta es “utf-8”.
Tiene dos métodos:
encode(str)
– regresa un dato de tipoUint8Array
de un string.encodeInto(str, destination)
– codifica unstr
endestination
, este último debe ser de tipoUint8Array
.
let encoder = new TextEncoder();
let uint8Array = encoder.encode("Hola");
alert(uint8Array); // 72,111,108,97