2021年8月21日

TextDecoder と TextEncoder

バイナリデータが実際は文字列である場合はどうなりますか? たとえば、テキストデータを含むファイルを受け取ったとします。

組み込みのTextDecoderオブジェクトを使用すると、バッファとエンコーディングを指定して、値を実際のJavaScript文字列に読み取ることができます。

最初に作成する必要があります

let decoder = new TextDecoder([label], [options]);
  • label – エンコーディング。デフォルトはutf-8ですが、big5windows-1251など、他にも多くのエンコーディングがサポートされています。
  • options – オプションオブジェクト
    • fatal – ブール値。trueの場合、無効な(デコードできない)文字に対して例外をスローし、それ以外の場合は(デフォルト)、それらを文字\uFFFDに置き換えます。
    • ignoreBOM – ブール値。trueの場合、BOM(オプションのバイトオーダーUnicodeマーク)を無視します。めったに必要ありません。

…そしてデコードします

let str = decoder.decode([input], [options]);
  • input – デコードするBufferSource
  • options – オプションオブジェクト
    • 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]);

// 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は逆の処理を行い、文字列をバイトに変換します。

構文は次のとおりです。

let encoder = new TextEncoder();

サポートされているエンコーディングは「utf-8」のみです。

2つのメソッドがあります。

  • encode(str) – 文字列からUint8Arrayを返します。
  • encodeInto(str, destination)strUint8Arrayでなければならないdestinationにエンコードします。
let encoder = new TextEncoder();

let uint8Array = encoder.encode("Hello");
alert(uint8Array); // 72,101,108,108,111
チュートリアルマップ

コメント

コメントする前にこれを読んでください…
  • 改善点に関する提案がある場合は、コメントする代わりにGitHub issueまたはプルリクエストを送信してください。
  • 記事の内容が理解できない場合は、詳しく説明してください。
  • 少数のコードを挿入するには<code>タグを使用し、複数行の場合は<pre>タグで囲み、10行を超える場合はサンドボックス(plnkrjsbincodepen…)を使用してください。