16 січня 2022 р.

TextDecoder та TextEncoder

А якщо бінарні дані є просто рядком? Наприклад, ми отримали файл з текстовими даними.

Вбудований об’єкт TextDecoder дає змогу записати дані в JavaScript рядок із заданого буферу з потрібним кодуванням.

Але для початку його необхідно створити:

let decoder = new TextDecoder([label], [options]);
  • label – кодування, типово utf-8, але також підтримуються big5, windows-1251 та багато інших кодувань.
  • options – необов’язковий об’єкт, який задає додаткові налаштування декодера:
    • fatal – булевий параметр, якщо передано true – буде згенеровано виключення для символів, які не вдасться декодувати, в іншому випадку (типово) вони будуть замінені на символ \uFFFD.
    • ignoreBOM – булевий параметр, якщо передано true – буде проігноровано BOM (Byte order mark — необов’язковий маркер порядку байтів), рідко трапляється в нагоді.

…А потім декодувати:

let str = decoder.decode([input], [options]);
  • inputBufferSource буфер для декодування.
  • options – необов’язковий об’єкт:
    • stream – значення true, якщо потрібно декодувати потік (stream), тоді decoder буде викликано повторно декілька разів для отримання вхідних даних частинами. В такому випадку символи, що складають з декількох байт можуть бути випадково розділеними між частинами. Ця опція дозволяє TextDecoder запам’ятати “незакінчені” символи для декодування разом з наступною частиною.

Наприклад:

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) ); // 你好

Також можливо частково декодувати буфер за допомогою створення представлення тільки з частиною масиву:

let uint8Array = new Uint8Array([0, 72, 101, 108, 108, 111, 0]);

// рядок всередині між першим та останнім байтом
// створення нового представлення без копіювання масиву
let binaryString = uint8Array.subarray(1, -1);

alert( new TextDecoder().decode(binaryString) ); // Hello

TextEncoder

TextEncoder працює зворотнім чином – перетворює рядок в байти.

Синтаксис:

let encoder = new TextEncoder();

Підтримується тільки кодування “utf-8”.

Об’єкт має два методи:

  • encode(str) – повертає Uint8Array створений з рядку.
  • encodeInto(str, destination)str буде закодовано та записано в destination. Параметр destination повинен мати тип Uint8Array.
let encoder = new TextEncoder();

let uint8Array = encoder.encode("Hello");
alert(uint8Array); // 72,101,108,108,111
Навчальна карта