2016-11-23 3 views

答えて

2

パート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フラグを使用して例外をスローすることができます。

関連する問題