web-dev-qa-db-ja.com

JavaのStringの内部表現は何ですか?変更されたUTF-8? UTF-16?

Javaの内部表現でStringを検索しましたが、信頼性はあるが一貫性がないように見える2つの資料があります。

1つは:

http://www.codeguru.com/cpp/misc/misc/multi-lingualsupport/article.php/c10451

そしてそれは言います:

Javaは、内部テキスト表現にUTF-16を使用し、文字列のシリアル化にUTF-8の非標準の変更をサポートします。

他は:

http://en.wikipedia.org/wiki/UTF-8#Modified_UTF-8

そしてそれは言います:

Tclは、Unicodeデータの内部表現にはJavaと同じ修正UTF-8 [25]を使用しますが、外部データには厳密なCESU-8を使用します。

変更されたUTF-8?またはUTF-16ですか?どちらが正しいか?また、メモリ内の文字にJavaを使用するバイト数は?

どれが正しいか、それが何バイトを使用しているか教えてください。

46
Johnny Lim

Javaは、内部テキスト表現にUTF-16を使用します

JavaのStringやStringBuilderなどの表現はUTF-16です

https://docs.Oracle.com/javase/8/docs/technotes/guides/intl/overview.html

Javaプラットフォームでテキストはどのように表されますか?

Javaプログラミング言語はUnicode文字セットに基づいており、いくつかのライブラリはUnicode標準を実装しています。Javaプログラミング言語のプリミティブデータ型charは、 U + 0000からU + FFFFの範囲のUnicodeコードポイント、またはUTF-16のコード単位を表すことができる符号なし16ビット整数Javaプラットフォームのさまざまなタイプとクラスchar []、Java.lang.CharSequenceの実装(Stringクラスなど)、およびJava.text.CharacterIteratorの実装を表す文字シーケンスはUTF-16シーケンスです。

JVMレベルでは、-XX:+UseCompressedStrings(Java 6)の一部の更新のデフォルトです)を使用している場合、実際のメモリ内表現は8ビット、ISO-8859- 1。ただし、UTF-16エンコードを必要としない文字列のみ。

http://www.Oracle.com/technetwork/Java/javase/tech/vmoptions-jsp-140102.html

文字列のシリアル化のためにUTF-8の非標準の変更をサポートします。

シリアル化された文字列は、デフォルトでUTF-8を使用します。

また、メモリ内の文字にJavaを使用するバイト数は?

Objectのパディングの必要性を無視する場合、charは常に2バイトです。

注:コードポイント(文字> 65535を許可)では、1つまたは2つの文字、つまり2または4バイトを使用できます。

58
Peter Lawrey

Java 9の前、Java Stringの標準メモリ内表現char[]に保持されているUTF-16コード単位です。変更されたUTF-8は他のコンテキストで使用されます。例えば「.class」ファイル、およびオブジェクトのシリアル化形式。

Java.lang.Stringクラスのソースコードを見ると、これを確認できます。

Java 6 update 21以降では、圧縮文字列を有効にする非標準オプション(-XX:UseCompressedStrings)がありました。この機能はJava 7で削除されました。

Java 9以降の場合、Stringがストリングのコンパクトな表現を使用するように変更された場合の動作デフォルトではJavaコマンド ドキュメント は次のようになりました:

-XX:-CompactStrings

コンパクト文字列機能を無効にします。 デフォルトでは、このオプションは有効です。このオプションを有効にすると、Javaシングルバイト文字のみを含む文字列が内部的に表現され、 ISO-8859-1/Latin-1エンコーディングを使用して、文字ごとに1バイトの文字列として保存されます。これにより、シングルバイト文字のみを含む文字列に必要なスペースが50%削減されます。少なくとも1つのマルチバイト文字を含むJava文字列の場合:これらは、UTF-16エンコードを使用して文字ごとに2バイトとして表され、保存されます。コンパクト文字列機能を無効にすると、すべてのJava文字列の内部表現としてUTF-16エンコーディングが強制的に使用されます。

「圧縮」または「コンパクト」のどちらの文字列もUTF-8エンコードを使用/使用しないことに注意してください。

こちらもご覧ください:

18
Stephen C

UTF-16。

http://Java.Sun.com/javase/technologies/core/basic/intl/faq.jsp から:

Javaプラットフォームでテキストはどのように表されますか?

Javaプログラミング言語はUnicode文字セットに基づいており、いくつかのライブラリはUnicode標準を実装しています。Javaプログラミング言語のプリミティブデータ型charは、 U + 0000からU + FFFFの範囲のUnicodeコードポイント、またはUTF-16のコード単位を表すことができる符号なし16ビット整数Javaプラットフォームのさまざまなタイプとクラスchar []、Java.lang.CharSequenceの実装(Stringクラスなど)、およびJava.text.CharacterIteratorの実装を表す文字シーケンスはUTF-16シーケンスです。

12

charのサイズは2バイトです。

したがって、Javaは内部文字列表現にUTF-16を使用します。

3
belgther