回答:
これについてはWebの周りに良い記事がたくさんあると思いますが、ここでは短い要約を示します。
UTF-8とUTF-16はどちらも可変長エンコーディングです。ただし、UTF-8では、文字が最低8ビットを占める可能性がありますが、UTF-16では、文字の長さは16ビットで始まります。
主なUTF-8プロ:
UTF-8の主な短所:
主なUTF-16プロ:
char
を文字列のプリミティブコンポーネントとして使用できます。主なUTF-16の短所:
一般に、BE / LEは無関係であり(ネイティブの順序を使用するだけ)、インデックス化が高速であるため(サロゲートペアを適切に処理することを忘れないでください)、メモリ内の表現には通常UTF-16が適しています。一方、UTF-8はテキストファイルやネットワークプロトコルに非常に適しています。これは、BE / LEの問題がなく、Null終端が便利で、ASCII互換であるためです。
これらは、Unicode文字を表すための単純に異なるスキームです。
どちらも可変長です-UTF-16は、一般的に使用されているほとんどの文字を含む基本多言語プレーン(BMP)のすべての文字に2バイトを使用します。
UTF-8は、BMPの文字に1〜3バイトを使用し、U + 0000〜U + 1FFFFFの現在のUnicode範囲の文字に最大4バイトを使用します。必要に応じて、U + 7FFFFFFFまで拡張できます...ただし、すべてのASCII文字はそれぞれ1バイトで表されます。
メッセージダイジェストの目的では、ダイジェストを再作成しようとするすべての人が同じオプションを使用する限り、どれを選択してもかまいません。
UTF-8とUnicodeの詳細については、このページを参照してください。
(すべてのJava文字はBMP内のUTF-16コードポイントであることに注意してください。U+ FFFFより上の文字を表すには、Javaでサロゲートペアを使用する必要があります。)
UTF-8とUTF-16の違いは?なぜこれらが必要なのですか?
UTF-16の実装にセキュリティ上の脆弱性が少なくともいくつかあります。詳細については、ウィキペディアを参照してください。
WHATWGとW3Cは、Web ではUTF-8のみを使用することを宣言しています。
ここで概説されている[セキュリティ]の問題は、UTF-8を排他的に使用することで解消されます。これは、多くの理由の1つであり、現在、すべてのものに必須のエンコーディングとなっています。
他のグループも同じことを言っています。
したがって、UTF-16はJavaやWindowsなどの一部のシステムで内部的に使用され続ける可能性がありますが、データファイルやデータ交換などでこれまでに見られなかったUTF-16の使用はほとんどなくなります。