Skip to content

Latest commit

History

History
77 lines (51 loc) · 4.26 KB

File metadata and controls

77 lines (51 loc) · 4.26 KB

TextDecoder и TextEncoder

Что если бинарные данные фактически являются строкой? Например, мы получили файл с текстовыми данными.

Встроенный объект 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));// Hello
letuint8Array=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));// Hello

TextEncoder

TextEncoder поступает наоборот – кодирует строку в бинарный массив.

Имеет следующий синтаксис:

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