UTF-8とUTF-16の違いは?なぜこれらが必要なのですか?
MessageDigest md = MessageDigest.getInstance("SHA-256");
String text = "This is some text";
md.update(text.getBytes("UTF-8")); // Change this to "UTF-16" if needed
byte[] digest = md.digest();
これについてはWebの周りに多くの良い記事があると思いますが、ここに短い要約があります。
UTF-8とUTF-16はどちらも可変長エンコーディングです。ただし、UTF-8では文字は最低8ビットを占めることがありますが、UTF-16では文字の長さは16ビットで始まります。
主なUTF-8の長所:
主なUTF-8の短所:
主なUTF-16の長所:
char
を文字列のプリミティブコンポーネントとして使用できます。 。主なUTF-16の短所:
一般に、UTF-16は、BE/LEが無関係で(ネイティブの順序を使用するだけ)、インデックス作成が高速であるため(サロゲートペアを適切に処理することを忘れないでください)、メモリ内表現に適しています。一方、UTF-8は、BE/LEの問題がなく、ヌル終了が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/16とは無関係です(一般に、UTF16に変換され、BE/LE部分は1行で設定できます)が、以下はStringをbyte []に変換する最も速い方法です。たとえば、提供されたケースにぴったりです(ハッシュコード)。 String.getBytes(enc)は比較的遅いです。
static byte[] toBytes(String s){
byte[] b=new byte[s.length()*2];
ByteBuffer.wrap(b).asCharBuffer().put(s);
return b;
}
UTF-8とUTF-16の違いは?なぜこれらが必要なのですか?
TF-16 の実装には、少なくとも2つのセキュリティ脆弱性があります。 詳細についてはウィキペディア を参照してください。
WHATWG と W3C は 現在宣言済み のみ TF-8 がWebで使用されることを意味します。
ここで概説した[セキュリティ]の問題は、UTF-8を排他的に使用することで解消されます。これは、現在すべてのものの必須のエンコードである多くの理由の1つです。
他のグループも同じことを言っています。
したがって、UTF-16はJavaやWindowsなどの一部のシステムで引き続き内部的に使用される場合がありますが、データファイルやデータ交換などで過去に見たUTF-16の使用はほとんどありません。おそらく完全に消えてしまいます。