17

コアJavaから、vol。1、第9版、p。69:

文字 ℤ には、UTF-16 エンコーディングで 2 つのコード単位が必要です。通話中

String sentence = "ℤ is the set of integers"; // for clarity; not in book
char ch = sentence.charAt(1)

はスペースを返しませんが、ℤ の 2 番目のコード単位を返します。

しかし、それはスペースを返すようsentence.charAt(1) です。たとえばif、次のコードのステートメントは に評価されtrueます。

String sentence = "ℤ is the set of integers";
if (sentence.charAt(1) == ' ')
    System.out.println("sentence.charAt(1) returns a space");

なんで?

関連する場合は、Ubuntu 12.10 で JDK SE 1.7.0_09 を使用しています。

4

4 に答える 4

10

この本は、「ℤ」は基本多言語面ではUTF-16文字ではないと言っているように聞こえますが、実際はそうです。

Javaは、基本多言語面にない文字の代理ペアを持つUTF-16を使用します。'ℤ'(0x2124)は基本多言語面にあるため、単一のコード単位で表されます。あなたの例sentence.charAt(0)では、'ℤ'sentence.charAt(1)を返し、''を返します。

サロゲートペアで表される文字には、文字を構成する2つのコードユニットがあります。sentence.charAt(0)最初のコードユニットsentence.charAt(1)を返し、2番目のコードユニットを返します。

http://docs.oracle.com/javase/6/docs/api/java/lang/String.htmlを参照してください。

文字列は、補足文字がサロゲートペアで表されるUTF-16形式の文字列を表します(詳細については、「CharacterクラスのUnicode文字表現」のセクションを参照してください)。インデックス値は文字コード単位を参照するため、補助文字は文字列内の2つの位置を使用します。

于 2013-01-04T04:46:20.917 に答える
8

ドキュメントによると、文字列は内部的に utf-16 として表されるため、charAt()2 つのコード ポイントが与えられます。個々のコード ポイントを表示することに興味がある場合は、このコードを使用できます (この回答から):

final int length = sentence.length();
for (int offset = 0; offset < length; ) {
   final int codepoint = sentence.codePointAt(offset);

   // do something with the codepoint

   offset += Character.charCount(codepoint);
}
于 2013-01-04T03:12:51.177 に答える
2

Javadocsはこれを説明します:

String は、補助文字がサロゲート ペアで表される UTF-16 形式の文字列を表します (詳細については、Character クラスの Unicode 文字表現のセクションを参照してください)。インデックス値は char コード単位を参照するため、補助文字は文字列内の 2 つの位置を使用します。

要するに、その本は間違っています。

以下のコメントから追加する編集:昨夜私が考えていなかったのは、あなたが質問で使用したキャラクターが実際には彼らが話しているものではなく、彼らが本当に得ているのはあなたが持っているときです. 2 バイトではなく 4 バイトを必要とする文字を持っています。Javadoc の上記の段落は、別の javadoc にリンクしています。これの影響について語るUnicode Character Representations 。

于 2013-01-04T03:12:30.517 に答える