Java文字列のコードポイントとコードユニット

2699 ワード

  • コードポイント:文字セットを符号化するために使用できる数値を指します.
  • コードユニット:コードポイントを格納するスペース.

  • まずその発生背景を簡単に説明すると、コンピュータが最初に誕生したとき、ASCII符号化だけが英語の文字を表すために使われ、コンピュータの普及に伴い、中国のGB 2312、西欧言語のISO 8859-1などの符号化の発生にも伴った.その後現れたUnicode文字符号化は、世界のすべての文字を表す言語辞書を作成することを望んでおり、その最初の設計では2バイトで表され、設計作業を開始すると、2バイトのコード幅は世界の各言語のすべての文字を符号化するのに十分であり、将来の拡張に十分な空間があると考えられている.しばらくすると、Unicode文字が65536文字を超えたのは、インターネットの普及に伴ってIPv 4アドレスが足りなくなったようなことが避けられない.最初にJavaを設計した時に2バイトのchar型を採用して16ビットのUnicode文字を表すことを決定したが、もちろんその時にUnicode文字が足りない場合はなかったが、その後Unicode文字が足りない場合があったため、Unicode文字は文字補完を増やし、補助文字は連続するコードユニットを符号化した.次はJDK 8から抜粋した言葉です.
    The char data type (and therefore the value that a Character object encapsulates) are based on the original Unicode specification, which defined characters as fixed-width 16-bit entities. The Unicode Standard has since been changed to allow for characters whose representation requires more than 16 bits. The range of legal code points is now U+0000 to U+10FFFF, known as Unicode scalar value. (Refer to the definition of the U+n notation in the Unicode Standard.) The set of characters from U+0000 to U+FFFF is sometimes referred to as the Basic Multilingual Plane (BMP). Characters whose code points are greater than U+FFFF are called supplementary characters. The Java platform uses the UTF-16 representation in char arrays and in the String and StringBuffer classes. In this representation, supplementary characters are represented as a pair of char values, the first from the high-surrogates range, (\uD800-\uDBFF), the second from the low-surrogates range (\uDC00-\uDFFF).
    charデータ型(したがって文字オブジェクトがカプセル化された値)は、固定幅の16ビットエンティティの文字として定義された元のUnicode仕様に基づいている.Unicode規格は、16ビットを超える文字が必要であることを示すように変更されました.コードポイントの範囲は、U+0000~u+10 ffffです.u+0000からU+FFFFまでの文字セットは、基本マルチテキストプレーン(BMP)と呼ばれる場合がある.文字の符号化点がU+FFFFより大きいことを補完文字と呼ぶ.JAvaプラットフォームはUTF-16で表される文字配列と文字列とStringBufferクラスを使用します.これは、補足文字が2文字値、1番目のコードユニット範囲(ud 800-udbff)、2番目のコードユニット周囲(udc 00-udfff)として表されることを意味する.次に例を示します.
    //1D306   
    char[] c = Character.toChars(Integer.parseInt("1D306", 16));
    String str = new String(c);  
    System.out.println(str.length());//2  
    System.out.println(str.codePointCount(0, str.length()));//1  

    文字列に補助文字が表示される場合、文字の個数を取得するにはcodePointCount()関数を使用する必要があります.length()関数を使用するとエラーが発生します.