オブジェクトのシリアル化とJNIに標準のUTF-8ではなく、Javaがmodified UTF-8を使用するのはなぜですか?JavaがUTF-8の代わりに変更されたUTF-8を使用するのはなぜですか?
変更されたUTF-8にヌル文字を埋め込むことができないため、ヌル文字で動作する関数を使用することができます。他の理由はありますか?
オブジェクトのシリアル化とJNIに標準のUTF-8ではなく、Javaがmodified UTF-8を使用するのはなぜですか?JavaがUTF-8の代わりに変更されたUTF-8を使用するのはなぜですか?
変更されたUTF-8にヌル文字を埋め込むことができないため、ヌル文字で動作する関数を使用することができます。他の理由はありますか?
補助文字を処理する(処理しない)方が処理が高速かつ簡単です。
Javaは文字を16ビットchar
として表しますが、ユニコードは64Kを超える文字を含むように進化しています。したがって、補助文字の中には、Javaの2 char
(サロゲートペア)でエンコードする必要があります。
厳密なUTF-8では、サロゲートペアを文字に変換し、文字をバイトにエンコードする必要があります。デコーダは補足キャラクタをサロゲートペアに戻す必要があります。
chars -> character -> bytes -> character -> chars
両端には、Javaをしているので、我々はいくつかのショートカットを取り、char
レベル
char -> bytes -> char
もないエンコーダやデコーダに直接エンコードすることができますが、サロゲート・ペアを心配する必要があります。
私はそれが主な理由だと考えます。 C言語では、文字列を処理する必要があり、組み込みのNULを含めると複雑になります。
Modified UTF-8の説明はUnicode Explained - Page 306ですが、については説明しません。変更されたUTF-8が決定されました。
BMP以外のUnicode文字のサポートがJavaに最初に追加された方法については、Java固有のドキュメントのSupplementary Characters in the Java Platformの説明もあります。しかし、再びについての説明はありません。変更されたUTF-8が決定されました。
なぜであるかは、Javaのアーキテクトに直接質問しないかぎり見つからないと思います。
これは_how_の素晴らしい説明ですが、_why_の情報は表示されません –
私はcourelにjava以外のシリアライズされたjavaオブジェクトを読み込もうとしているのですか? – radai
@radai:私は何も読んでいない、ちょうど質問をしています。 =) – vitaut
その場合、NPEは正しいと思います。 Cとの対話(シリアライズ、JNI、クラスファイルの解析)が必要なときにいつでも使用するように見えます。 – radai