web-dev-qa-db-ja.com

Javaの文字列の文字エンコードとは何ですか?

実際、Javaでの文字列のエンコードに関して混乱しています。いくつか質問があります。それらの答えを知っているなら私を助けてください:

1)メモリ内のJava文字列のネイティブエンコーディングは何ですか?String a = "Hello"どの形式で保存されますか? Javaはマシンに依存しないため、システムがエンコードを行うとは思わない。

2)「UTF-16」がデフォルトのエンコーディングであるとネットで読みましたが、int a = 'c' ASCIIテーブル内の文字の番号を取得します。ASCIIとUTF-16は同じですか?

3)また、メモリ内の文字列のストレージが何に依存しているかについても確信が持てませんでした:OS、言語?

45
user506710

1)文字列はオブジェクトであり、通常、char配列と文字列の長さが含まれます。通常、文字配列は16ビットワードの連続した配列として実装され、各配列にはネイティブバイト順のUnicode文字が含まれます。

2)文字値を整数に割り当てると、16ビットUnicode文字コードが整数値に変換されます。したがって、U + 0063である'c'は、0x0063または99になります。

3)各Stringはオブジェクトであるため、クラスメンバー以外の情報(クラス記述子Word、ロック/セマフォWordなど)が含まれます。

[〜#〜]補遺[〜#〜]
オブジェクトの内容は、JVM実装(各オブジェクトに関連する固有のオーバーヘッドを決定します)、およびクラスの実際のコーディング方法(つまり、一部のライブラリは他のライブラリよりも効率的です)に依存します。

[〜#〜] example [〜#〜]
典型的な実装では、オブジェクトインスタンスごとに2ワードのオーバーヘッドが割り当てられます(クラス記述子/ポインター、およびセマフォ/ロック制御ワード用)。 Stringオブジェクトには、int長さとchar[]配列参照も含まれます。文字列の実際の文字コンテンツは、2番目のオブジェクトchar[]配列に格納されます。この配列には、2ワード、配列長Word、さらに文字列に必要な16ビットchar要素が割り当てられます(さらに、文字列が作成されたときにぶらぶらしていた余分な文字)。

補遺2
onecharがoneUnicode文字を表す場合は、ほとんどの場合にのみ当てはまります。これは、 CS-2 エンコードおよび2005年以前のtrueを意味します。しかし、今ではユニコードが大きくなり、文字列はUTF-16を使用してエンコードする必要があります-残念ながら、単一のユニコード文字はtwochars in a Java String

Apacheの実装の実際のソースコードを見てください。で:
http://www.docjar.com/html/api/Java/lang/String.Java.html

20
David R Tribble
  1. Javaは文字列を内部的にUTF-16として保存します。

  2. 「デフォルトのエンコーディング」は適切ではありません。 Javaは文字列を内部的にUTF-16として保存しますが、外部で使用されるエンコーディング、「システムデフォルトエンコーディング」はプラットフォームによって異なり、一部のプラットフォームの環境変数などによっても変更される。

    ASCIIは、UnicodeのサブセットであるLatin 1のサブセットです。 UTF-16はUnicodeをエンコードする方法です。したがって、int i = 'x' ASCIIの範囲に入る文字をテストします。ASCII値。UTF-16はASCIIよりも多くの文字を表すことができます。しかしながら。

  3. Java.lang.Character docs から:

    Java 2プラットフォームは、char配列とStringおよびStringBufferクラスでUTF-16表現を使用します。

    したがって、Java 2プラットフォームの一部として、これらのクラスにUTF-16が使用されることが定義されています。

37

これはあなたの質問には答えませんが、注目に値します... Javaバイトコード(クラスファイル)では、文字列はUTF-8で保存されます。 http ://Java.Sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html

4
Ralph

編集:私の答えを修正するのを手伝ってくれたLoadMasterに感謝します:)

1)すべての内部文字列処理はUTF-16で行われます。

2)ASCIIはUTF-16のサブセットです。

3)JavaはUTF-16です。残りの部分は、どこにいるかによって異なります.

1
LaGrandMere