Skip to content

TextDecoder and TextEncoder #256

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jan 16, 2022
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 22 additions & 22 deletions 4-binary/02-text-decoder/article.md
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
# TextDecoder and TextEncoder
# TextDecoder та TextEncoder

What if the binary data is actually a string? For instance, we received a file with textual data.
А якщо бінарні дані є просто рядком? Наприклад, ми отримали файл з текстовими даними.

The built-in [TextDecoder](https://encoding.spec.whatwg.org/#interface-textdecoder) object allows one to read the value into an actual JavaScript string, given the buffer and the encoding.
Вбудований об’єкт [TextDecoder](https://encoding.spec.whatwg.org/#interface-textdecoder) дає змогу записати дані в JavaScript рядок із заданого буферу з потрібним кодуванням.

We first need to create it:
Але для початку його необхідно створити:
```js
let decoder = new TextDecoder([label], [options]);
```

- **`label`** -- the encoding, `utf-8` by default, but `big5`, `windows-1251` and many other are also supported.
- **`options`** -- optional object:
- **`fatal`** -- boolean, if `true` then throw an exception for invalid (non-decodable) characters, otherwise (default) replace them with character `\uFFFD`.
- **`ignoreBOM`** -- boolean, if `true` then ignore BOM (an optional byte-order Unicode mark), rarely needed.
- **`label`** -- кодування, типово `utf-8`, але також підтримуються `big5`, `windows-1251` та багато інших кодувань.
- **`options`** -- необов’язковий об’єкт, який задає додаткові налаштування декодера:
- **`fatal`** -- булевий параметр, якщо передано `true` -- буде згенеровано виключення для символів, які не вдасться декодувати, в іншому випадку (типово) вони будуть замінені на символ `\uFFFD`.
- **`ignoreBOM`** -- булевий параметр, якщо передано `true` -- буде проігноровано BOM (Byte order mark — необов’язковий маркер порядку байтів), рідко трапляється в нагоді.

...And then decode:
...А потім декодувати:

```js
let str = decoder.decode([input], [options]);
```

- **`input`** -- `BufferSource` to decode.
- **`options`** -- optional object:
- **`stream`** -- true for decoding streams, when `decoder` is called repeatedly with incoming chunks of data. In that case a multi-byte character may occasionally split between chunks. This options tells `TextDecoder` to memorize "unfinished" characters and decode them when the next chunk comes.
- **`input`** -- `BufferSource` буфер для декодування.
- **`options`** -- необов’язковий об’єкт:
- **`stream`** -- значення `true`, якщо потрібно декодувати потік (stream), тоді `decoder` буде викликано повторно декілька разів для отримання вхідних даних частинами. В такому випадку символи, що складають з декількох байт можуть бути випадково розділеними між частинами. Ця опція дозволяє `TextDecoder` запам’ятати "незакінчені" символи для декодування разом з наступною частиною.

For instance:
Наприклад:

```js run
let uint8Array = new Uint8Array([72, 101, 108, 108, 111]);
Expand All @@ -39,34 +39,34 @@ let uint8Array = new Uint8Array([228, 189, 160, 229, 165, 189]);
alert( new TextDecoder().decode(uint8Array) ); // 你好
```

We can decode a part of the buffer by creating a subarray view for it:
Також можливо частково декодувати буфер за допомогою створення представлення тільки з частиною масиву:


```js run
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](https://encoding.spec.whatwg.org/#interface-textencoder) does the reverse thing -- converts a string into bytes.
[TextEncoder](https://encoding.spec.whatwg.org/#interface-textencoder) працює зворотнім чином -- перетворює рядок в байти.

The syntax is:
Синтаксис:

```js
let encoder = new TextEncoder();
```

The only encoding it supports is "utf-8".
Підтримується тільки кодування "utf-8".

It has two methods:
- **`encode(str)`** -- returns `Uint8Array` from a string.
- **`encodeInto(str, destination)`** -- encodes `str` into `destination` that must be `Uint8Array`.
Об’єкт має два методи:
- **`encode(str)`** -- повертає `Uint8Array` створений з рядку.
- **`encodeInto(str, destination)`** -- `str` буде закодовано та записано в `destination`. Параметр `destination` повинен мати тип `Uint8Array`.

```js run
let encoder = new TextEncoder();
Expand Down