web-dev-qa-db-ja.com

Java-文字、コードポイント、サロゲートとは何ですか?それらの違いは何ですか?

「文字」、「コードポイント」、「サロゲート」という用語の説明を探しています。これらの用語はJavaに限定されていませんが、言語固有の違いがある場合は、次のように説明します。 Javaに関連しています。

文字とコードポイントの違いに関するいくつかの情報を見つけました。文字は人間のユーザーに表示されるものであり、コードポイントはその特定の文字をエンコードする値ですが、サロゲートについてはわかりません。サロゲートとは何ですか?また、サロゲートは文字やコードポイントとどのように異なりますか?文字とコードポイントの正しい定義はありますか?

別のスレッド で文字列を文字の配列としてステップスルーすることについて、この質問を引き起こした特定のコメントは、「この手法はコードポイントではなく文字を提供するので、サロゲートが発生する可能性があることに注意してください。」私は本当に理解していなかったので、5年前の質問に対して長いコメントを作成するのではなく、新しい質問で説明を求めるのが最善だと思いました。

29
Alium Britt

コンピュータでテキストを表すには、2つのことを解決する必要があります。最初に、シンボルを数値にマッピングする必要があります。次に、これらの数値のシーケンスをバイトで表す必要があります。

コードポイント は、シンボルを識別する番号です。 ASCIIおよびUnicodeです。ASCIIは128個のシンボルを定義します。Unicodeは現在109384個のシンボルを定義しています。これは2を超える方法です。16

さらに、ASCIIは、数値シーケンスが数値ごとに1バイトで表されることを指定しますが、Unicodeは、UTF-8、UTF-16、UTF-32などのいくつかの可能性を指定します。

すべての可能な値を表すために必要な文字数よりも少ない文字あたりのビット数を使用するエンコーディング(16ビットを使用するUTF-16など)を使用しようとすると、いくつかの回避策が必要です。

したがって、 Surrogates は、1つの2バイト値に収まらないシンボルを示す16ビット値です。

JavaはUTF-16を使用します。

特に、char(文字)は、UTF-16値を含む符号なし2バイト値です。

JavaおよびUnicodeについて詳しく知りたい場合は、このニュースレターをお勧めします: Part 1Part 2

23
Cephalopod

クラスのJavadocに簡単な説明があります Java.lang.Character

Unicode文字表現

charデータ型(およびCharacterオブジェクトがカプセル化する値)は、文字を固定幅の16ビットエンティティとして定義した元のUnicode仕様に基づいています。 Unicode標準は、表現が16ビットを超える必要がある文字を許可するように変更されました。有効なコードポイントの範囲はU+0000からU+10FFFFになり、Unicodeスカラー値として知られています。 [..]

U+0000からU+FFFFまでの文字セットは、Basic Multilingual Plane(BMP)と呼ばれることがあります。コードポイントがU+FFFFより大きい文字は、補足文字と呼ばれます。 Javaプラットフォームは、char配列とStringおよびStringBufferクラスでUTF-16表現を使用します。この表現では、補助文字はchar値のペアとして表され、最初はhigh-surrogates範囲から、(\ uD800-\uDBFF)、2番目は // =)low-surrogates範囲(\ uDC00-\uDFFF)。

言い換えると:

コードポイントは通常、単一の文字を表します。元々、タイプcharの値は、Unicodeコードポイントと正確に一致していました。このエンコーディングは CS-2 とも呼ばれていました。

そのため、charは16ビット型として定義されました。ただし、現在Unicodeでは2 ^ 16文字を超えています。 文字セット全体をサポートするために、エンコーディングが固定長エンコーディング CS-2 から可変長エンコーディング TFに変更されました-16 。このエンコーディングでは、各コードポイントは1つのcharまたは2つのcharsで表されます。後者の場合、2つの文字はサロゲートペアと呼ばれます。

UTF-16は、すべてのコードポイントが2 ^ 14未満である場合、UTF-16でエンコードされたテキストとUCS-2で違いがないように定義されています。つまり、charを使用して、すべてではない文字を表すことができます。 文字が単一のchar内で表現できない場合、charという用語は誤解を招く可能性があります。16ビットとしてのみ使用されるためです。語。

14
nosid

コードポイントは通常、Unicodeコードポイントを指します。 Unicode用語集はこれを言っています:

Codepoint(1) :Unicodeコードスペースの任意の値。つまり、0から10FFFF16までの整数の範囲です。

Javaでは、文字(char)は符号なし16ビット値です。つまり、0からFFFFです。

ご覧のとおり、Java文字として表現できるUnicodeコードポイントがさらにあります。それでもJavaは、すべての有効なUnicodeを使用してテキストを表現できる必要がありますコードポイント。

Javaがこれに対処する方法は、FFFFより大きいコードポイントを文字(pair)として表すことです(コードunits);すなわち サロゲートペア 。これらのencode16ビット値のペアとしてのFFFFより大きいUnicodeコードポイント。これは、Unicodeコードスペースのサブレンジ(D800からU + DFFFまで)がサロゲートペアを表すために予約されているという事実を利用しています。技術的な詳細は here です。


Javaが使用しているエンコーディングの適切な用語は TF-16エンコーディング形式 です。

もう1つの用語は コード単位 で、これは特定のエンコーディングで使用される最小の表現単位です。 UTF-16では、コード単位は16ビットであり、これはJava charに対応します。他のエンコーディング(UTF-8、ISO 8859-1など)は8ビットです。コード単位、およびUTF-32には32ビットのコード単位があります。


文字という用語には多くの意味があります。それは、さまざまな状況でのあらゆる種類のことを意味します。 Unicode用語集では、 Character には次の4つの意味があります。

キャラクター。 (1)セマンティックな価値を持つ記述言語の最小コンポーネント。特定の形状(グリフも参照)ではなく、抽象的な意味および/または形状を指しますが、コード表では、読者の理解のために何らかの形の視覚表現が不可欠です。

キャラクター。 (2)抽象文字の同義語。 ( 抽象文字 。テキストデータの編成、制御、または表現に使用される情報の単位。)

キャラクター。 (3)Unicode文字エンコーディングのエンコーディングの基本単位。

キャラクター。 (4)中国起源の表意文字で書かれた要素の英語名。 [表意文字(2)を参照してください。]

そして、Javaキャラクターの特定の意味があります。

7
Stephen C

まず、Unicodeは、英語の文字から中国語、数字、記号など、すべての言語のすべての個々の文字を定義してマッピングしようとする標準です。

基本的にユニコードには番号付き文字の長いリストがあり、コードポイントは番号付けを指します。

要するに

  • Charactersは、文字、数字、記号など、テキスト内の個々のトークンです。
  • コードポイントは、Unicode標準でのトークンの番号付けを指します
  • UTF-16エンコーディングスキームを使用して表された文字は非常に多くの文字を格納しているため、1つのa Java文字の割り当てられたスペースにすべてが収まらない.
  • サロゲートペア は、1つの文字が1組の文字のスペースで表される必要があることを示すために使用される用語です。 サロゲートペアは、Unicodeテーブルで1つの文字が非常に高い位置にあるため、それを表すために1組の文字スペースが必要であることを表す用語です。
5
Johan Sjöberg