パート1:バイトは
TextDecoderインタフェースは、基礎となるArrayBuffer(バイトシーケンス)で動作する負でないInt8Arrayビューがラップします。
これ:バイトは0xFF、0xFFを含有ArrayBufferある
new TextDecoder('utf-8').decode(new Int8Array([-1, -1]).buffer)
:
new TextDecoder('utf-8').decode(new Int8Array([-1, -1]))
は同じです。パート2
new TextDecoder('utf-8').decode(new Uint8Array([255, 255]))
:だから、それは同じだUTF-8デコード
0xFFをUTF-8での有効なコード・シーケンスではありませんので、エラーとしてデコードします。その結果、置き換え文字(U + FFFD)になります。
""
パート3:UTF-8とUTF-8エンコード
エンコーディングU + FFFD与え2 0xFFでは、あなたがU + FFFD U + FFFDかを取得するバイトがありますので、バイト0xEF 0xBF 0xBDです。したがって、U + FFFD U + FFFDの文字列をエンコードすると、0xEF 0xBF 0xBDバイトまたは10進数が返されます。239 191 189 239 191 189
...これは結果として得られたものです。
これは、指定したとおりに動作します。
だから何が問題なのですか?
私の推測では、任意のバイトを文字列にエンコードできると仮定しています。これは、テキストエンコーディングの仕組みではありません。テキストエンコーディングは、文字列の要素からバイトシーケンスへのマッピングを定義します。
すべてのエンコーディングが文字列のすべての要素を表すわけではありませんが、UTF-8(およびUTF-16)はJavaScript文字列で発生するすべてのコードポイントを表すことができます。
しかし、逆はではなく、となります。すべてのバイトシーケンスが文字に対応するわけではありません。無効なバイト列が見つかると、エラーが発生します。既定では、TextDecoder APIは置換文字( U + FFFD)を生成しますが、代わりにfatal
フラグを使用して例外をスローすることができます。