Что если бинарные данные фактически являются строкой? Например, мы получили файл с текстовыми данными.
Встроенный объект TextDecoder позволяет декодировать данные из бинарного буфера в обычную строку.
Для этого прежде всего нам нужно создать сам декодер:
letdecoder=newTextDecoder([label],[options]);label-- тип кодировки,utf-8используется по умолчанию, но также поддерживаютсяbig5,windows-1251и многие другие.options-- объект с дополнительными настройками:fatal-- boolean, если значениеtrue, тогда генерируется ошибка для невалидных (не декодируемых) символов, в ином случае (по умолчанию) они заменяются символом\uFFFD.ignoreBOM-- boolean, если значениеtrue, тогда игнорируется BOM (дополнительный признак, определяющий порядок следования байтов), что необходимо крайне редко.
...и после использовать его метод decode:
letstr=decoder.decode([input],[options]);input-- бинарный буфер (BufferSource) для декодирования.options-- объект с дополнительными настройками:stream-- true для декодирования потока данных, при этомdecoderвызывается вновь и вновь для каждого следующего фрагмента данных. В этом случае многобайтовый символ может иногда быть разделён и попасть в разные фрагменты данных. Это опция указываетTextDecoderзапомнить символ, на котором остановился процесс, и декодировать его со следующим фрагментом.
Например:
letuint8Array=newUint8Array([72,101,108,108,111]);alert(newTextDecoder().decode(uint8Array));// Helloletuint8Array=newUint8Array([228,189,160,229,165,189]);alert(newTextDecoder().decode(uint8Array));// 你好Мы можем декодировать часть бинарного массива, создав подмассив:
letuint8Array=newUint8Array([0,72,101,108,108,111,0]);// Возьмём строку из середины массива// Также обратите внимание, что это создаёт только новое представление без копирования самого массива. // Изменения в содержимом созданного подмассива повлияют на исходный массив и наоборот.letbinaryString=uint8Array.subarray(1,-1);alert(newTextDecoder().decode(binaryString));// HelloTextEncoder поступает наоборот – кодирует строку в бинарный массив.
Имеет следующий синтаксис:
letencoder=newTextEncoder();Поддерживается только кодировка "utf-8".
Кодировщик имеет следующие два метода:
encode(str)-- возвращает бинарный массивUint8Array, содержащий закодированную строку.encodeInto(str, destination)-- кодирует строку (str) и помещает её вdestination, который должен быть экземпляромUint8Array.
letencoder=newTextEncoder();letuint8Array=encoder.encode("Hello");alert(uint8Array);// 72,101,108,108,111