実際、Javaでの文字列のエンコードに関して混乱しています。いくつか質問があります。それらの答えを知っているなら私を助けてください:
1)メモリ内のJava文字列のネイティブエンコーディングは何ですか?String a = "Hello"
どの形式で保存されますか? Javaはマシンに依存しないため、システムがエンコードを行うとは思わない。
2)「UTF-16」がデフォルトのエンコーディングであるとネットで読みましたが、int a = 'c'
ASCIIテーブル内の文字の番号を取得します。ASCIIとUTF-16は同じですか?
3)また、メモリ内の文字列のストレージが何に依存しているかについても確信が持てませんでした:OS、言語?
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を使用してエンコードする必要があります-残念ながら、単一のユニコード文字はtwochar
s in a Java String
。
Apacheの実装の実際のソースコードを見てください。で:
http://www.docjar.com/html/api/Java/lang/String.Java.html
Javaは文字列を内部的にUTF-16として保存します。
「デフォルトのエンコーディング」は適切ではありません。 Javaは文字列を内部的にUTF-16として保存しますが、外部で使用されるエンコーディング、「システムデフォルトエンコーディング」はプラットフォームによって異なり、一部のプラットフォームの環境変数などによっても変更される。
ASCIIは、UnicodeのサブセットであるLatin 1のサブセットです。 UTF-16はUnicodeをエンコードする方法です。したがって、int i = 'x'
ASCIIの範囲に入る文字をテストします。ASCII値。UTF-16はASCIIよりも多くの文字を表すことができます。しかしながら。
Java 2プラットフォームは、char配列とStringおよびStringBufferクラスでUTF-16表現を使用します。
したがって、Java 2プラットフォームの一部として、これらのクラスにUTF-16が使用されることが定義されています。
これはあなたの質問には答えませんが、注目に値します... Javaバイトコード(クラスファイル)では、文字列はUTF-8で保存されます。 http ://Java.Sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html
編集:私の答えを修正するのを手伝ってくれたLoadMasterに感謝します:)
1)すべての内部文字列処理はUTF-16で行われます。
2)ASCIIはUTF-16のサブセットです。
3)JavaはUTF-16です。残りの部分は、どこにいるかによって異なります.