А якщо бінарні дані є просто рядком? Наприклад, ми отримали файл з текстовими даними.
Вбудований об’єкт 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]);
input
–BufferSource
буфер для декодування.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