なぜ、このUnicode文字はUTF-16エンコーディングで6つのバイトで終わるのでしょうか?

mahonya:

私はへの受け入れ答えからコードスニペットで遊んでいたこの質問私は単純に次のようにUTF-16を使用するためにバイト配列を追加しました:

final char[] chars = Character.toChars(0x1F701);
final String s = new String(chars);
final byte[] asBytes = s.getBytes(StandardCharsets.UTF_8);
final byte[] asBytes16 = s.getBytes(StandardCharsets.UTF_16);

chars (コードポイントがBMPの外にあるので)、Javaで2つの16ビット整数を意味し、2つの要素を有しています。

asBytes それは理にかなっているように、我々は、文字から2つの16ビット整数を表すために必要だろうものである32ビットに相当する4つの要素を有しています。

asBytes16私を混乱させる何である6つの要素を持っています。32ビットは、このUnicode文字を表現するのに十分であるのに、なぜ私たちは2つの余分なバイトで終わるのですか?

チャールズDowbecki:

UTF-16のバイトで始まるバイト順マーク FEFF値はビッグエンディアンでエンコードされていることを示します。ウィキBOMあたりとしてもUTF-8からUTF-16を区別するために使用されます。

彼らの存在は、ファイルがUTF-8でエンコードされていないことを示しているので、どちらもこれらの配列の、有効なUTF-8ではありません。

あなたは、変換することができますbyte[]16進数でエンコードされたにStringあたりとしてこの回答

asBytes   = F09F9C81
asBytes16 = FEFFD83DDF01

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=167977&siteId=1