web-dev-qa-db-ja.com

Java Unicodeエンコーディング

A Java char2バイト (最大サイズ65,536)ですが、 95,221 Unicode文字があります。 Javaアプリケーションで特定のUnicode文字を処理できないこと

これは、使用している文字エンコードに要約されますか?

36
Marcus Leon

十分に注意すれば、それらすべてを処理できます。

JavaのcharTF-16コード単位 です。コードポイント> 0xFFFFの文字の場合、2 chars(サロゲートペア)でエンコードされます。

Javaでこれらの文字を処理する方法については、 http://www.Oracle.com/us/technologies/Java/supplementary-142654.html を参照してください。

(ところで、Unicode 5.2では、1,114,112スロットのうち107,154文字が割り当てられています。)

35
kennytm

Javaは TF-16 を使用します。単一のJava charは、 基本的な多言語面 の文字のみを表すことができます。他の文字は、2つのcharsのサロゲートペア。これは、 String.codePointAt() などのAPIメソッドに反映されます。

そして、はい、これは、多くのJavaコードが基本的な多言語面以外の文字で使用されると、何らかの形で壊れることを意味します。

14

他の回答に追加するために、覚えておくべきいくつかのポイント:

  • Java charは常に16ビットを取ります。

  • Unicode文字は、UTF-16としてエンコードされる場合、「ほぼ常に」(常にではない)16ビットを取ります。これは、64K以上のUnicode文字があるためです。したがって、Java charはUnicode文字ではありません(ただし、「ほぼ常に」はそうです)。

  • 上記の「ほぼ常に」は、Unicodeの最初のコードポイント64Kを意味します。範囲は0x0000〜0xFFFF( [〜#〜] bmp [〜#〜] )で、UTF-16で16ビットを使用しますエンコーディング。

  • 非BMP(「まれな」)Unicode文字は、two Java chars(代理表現)として表されます。文字列としてのリテラル表現にも適用されます。 たとえば、文字U + 20000は「\ uD840\uDC00」と記述されます。

  • Corolary:string.length()は、Java chars、Unicode文字ではありません。1つの「まれな」ユニコード文字(U + 20000など)を持つ文字列は、length() = 2。同じ考慮事項が、文字シーケンスを処理するすべてのメソッドに適用されます。

  • Javaには、非BMPユニコード文字全体を処理するためのインテリジェンスがほとんどありません。文字をコードポイントとして扱うユーティリティメソッドがいくつかあります。たとえば、Character.isLetter(int ch)のように整数で表されます。これらは実際の完全なUnicodeメソッドです。

13
leonbloy

J2SE 1.5でのUnicode 4.0サポート の記事をご覧になり、Unicode 4.0のすべてのコードポイントをサポートするためにSunが考案したトリックの詳細をご覧ください。

要約すると、Unicode 4.0の次の変更点はJava 1.5:

  • charはUTF-16コード単位であり、コードポイントではありません
  • 新しい低レベルAPIはintを使用してUnicodeコードポイントを表します
  • サロゲートペアを理解するために高レベルAPIが更新されました
  • charベースのメソッドではなく、charシーケンスAPIへの設定

Javaには32ビット文字がないため、この優れたUnicodeサポートを呼び出すことができるかどうかを判断させていただきます。

3
Pascal Thivent

nicode Character Representations に関するOracleのドキュメントは次のとおりです。または、必要に応じて、 詳細なドキュメントはこちら をご覧ください。

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

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

したがって、char値は、サロゲートコードポイントまたはUTF-16エンコーディングのコードユニットを含むBasic Multilingual Plane(BMP)コードポイントを表します。 int値は、補助コードポイントを含むすべてのUnicodeコードポイントを表します。intの下位(最下位)21ビットはUnicodeコードポイントを表すために使用され、上位(最上位)11ビットはゼロでなければなりません。特に指定がない限り、補助文字およびサロゲートchar値に関する動作は次のとおりです。

  • Char値のみを受け入れるメソッドは、補助文字をサポートできません。これらは、サロゲート範囲のchar値を未定義の文字として扱います。たとえば、Character.isLetter( '\ uD840')はfalseを返しますが、この特定の値の後に文字列の下位サロゲート値が続く場合は文字を表します。
  • Int値を受け入れるメソッドは、補助文字を含むすべてのUnicode文字をサポートします。たとえば、Character.isLetter(0x2F81A)は、コードポイント値が文字(CJK表意文字)を表すため、trueを返します。
2
Rose Perrone

StringのOpenJDK7ドキュメント から:

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

1
Brian Agnew