こんにちは。ハンドルネーム「Javaを復習する初心者」です。このサイトはプログラミング言語Javaの復習・学習をするブログです。プログラムの開発・実行はEclipseで行ってます。
スポンサーリンク
お知らせ
  • 参考文献のページ作りました。
  • Amazon.co.jpアソシエイトに参加していますが、参考文献の紹介はもしもアフィリエイトに統一しました。
  • 2016年10月9日からは投稿ペースを落とします。週1回くらいにする予定です。
スポンサーリンク

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

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