こんにちは。「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つ使ってサロゲートペアが格納されるようです。