TextDecoder a TextEncoder

Co když jsou binární data ve skutečnosti řetězec? Například jsme obdrželi soubor s textovými daty.

Vestavěný objekt TextDecoder umožňuje načíst hodnotu do skutečného řetězce JavaScriptu s ohledem na vyrovnávací paměť a kódování.

Nejprve jej musíme vytvořit:

let decoder = new TextDecoder([label], [options]);
  • label – kódování, utf-8 ve výchozím nastavení, ale big5 , windows-1251 a mnoho dalších je také podporováno.
  • options – volitelný objekt:
    • fatal – boolean, pokud true pak vyvolá výjimku pro neplatné (nedekódovatelné) znaky, jinak je (výchozí) nahraďte znakem \uFFFD .
    • ignoreBOM – boolean, pokud true pak ignorujte kusovník (volitelná značka Unicode pro pořadí bajtů), zřídka potřebná.

…A pak dekódujte:

let str = decoder.decode([input], [options]);
  • input BufferSource k dekódování.
  • options – volitelný objekt:
    • stream – true pro dekódování streamů, když decoder se opakovaně volá s příchozími bloky dat. V takovém případě se může vícebajtový znak příležitostně rozdělit na části. Tato volba říká TextDecoder zapamatovat si „nedokončené“ znaky a dekódovat je, až přijde další díl.

Například:

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

Část vyrovnávací paměti můžeme dekódovat tak, že pro ni vytvoříme pohled podpole:

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

// the string is in the middle
// create a new view over it, without copying anything
let binaryString = uint8Array.subarray(1, -1);

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

TextEncoder

TextEncoder dělá obrácenou věc – převádí řetězec na bajty.

Syntaxe je:

let encoder = new TextEncoder();

Jediné kódování, které podporuje, je „utf-8“.

Má dvě metody:

  • encode(str) – vrátí Uint8Array ze řetězce.
  • encodeInto(str, destination) – kóduje str do destination to musí být Uint8Array .
let encoder = new TextEncoder();

let uint8Array = encoder.encode("Hello");
alert(uint8Array); // 72,101,108,108,111