java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

コードポイントを判定する

投稿日:

最終更新日:2016年07月01日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

API仕様書でStringクラスのメソッドを見ているとサロゲートペア、コードポイントという言葉が目に入り、気になって調べてました。そうしているうちにCharacterクラスを調べてました。そんなわけで、今回はコードポイントを引数に取るCharacter#charCountというメソッドを使ってみました。

このメソッドはstaticなのでインスタンスの生成なしで使えます。API仕様書によると、このメソッドは「指定された文字が0x10000以上である場合は2を返します。」のようです。実際にソースをみると三項演算子で定数MIN_SUPPLEMENTARY_CODE_POINTと比較して2か1を返しているメソッドでした。MIN_SUPPLEMENTARY_CODE_POINTの値は0x010000と定義されてました。ここで接頭辞の「0x」は16進数を表します。

Character#charCount

簡単なソースで実験をしました。

ソースコード

package characterTest;

public class HelloCodePoint {

public static void main(String[] args) {

System.out.printf("MIN_SUPPLEMENTARY_CODE_POINT : 0x%x", Character.MIN_SUPPLEMENTARY_CODE_POINT);
System.out.println();

System.out.println("0x3042 :" + Character.charCount(0x3042));
System.out.println("0x1f22e :" + Character.charCount(0x1f22e));

}

}

結果

MIN_SUPPLEMENTARY_CODE_POINT : 0x10000
0x3042 :1
0x1f22e :2

printfで使用している「%x」は16進数で表示する場合の書式です。

上記結果で、0x3042はchar値1個、0x1f22eはchar値2個必要ということが分かりました。(メソッドの内容から当然なのではあるのですが。)では、実際にどんな文字なのか、それを以下の表にしました。

文字 数値文字参照
あ
🈮

上記の表で「あ」はどの環境でも出てくると思います。その下の文字は環境によっては表示されないかもしれません。「右」という文字が四角い枠に囲まれているという文字です。読み方は知りません。「みぎ」を漢字変換していたときに偶然見つけたものです。

サロゲートペアを算出

「🈮」が表す文字はchar2個なのですが、それら値の組み合わせがサロゲートペアを呼ぶようです。また、それぞれが上位サロゲート、下位サロゲートと呼ぶようです。コードポイントからサロゲートペアを算出する式がネットにありましたので、それを参考に以下の実験をしました。

ソースコード

package characterTest;

public class HelloCodePointSurrogatePair {

public static void main(String[] args) {

String s = "";

System.out.println("length: " + s.length());

System.out.printf("[0]: %x", (int)s.charAt(0)); // 上位サロゲート
System.out.println();
System.out.printf("[1]: %x", (int)s.charAt(1)); // 下位サロゲート
System.out.println();

int codePoint = 0x1f22e;
int h = (codePoint - Character.MIN_SUPPLEMENTARY_CODE_POINT) / 0x400 + 0xD800; // 上位サロゲート算出
int l = (codePoint - Character.MIN_SUPPLEMENTARY_CODE_POINT) % 0x400 + 0xDC00; // 下位サロゲート算出

System.out.printf("h: %x", h);
System.out.println();
System.out.printf("l: %x", l);

}

}

結果

length: 2
[0]: d83c
[1]: de2e
h: d83c
l: de2e

String sの箇所は「右」という文字を枠で囲った文字です。char値2個必要なため、char型に格納できませんので、String型に格納しています。結果を見ると変数sは内部でchar[0]とchar[1]を保持しているようです。どのような仕組みかわかりませんでしたが、String型にサロゲート文字を代入するとchar2つが使われ、char2つ使ってサロゲートペアが格納されるようです。