文字列から指定したインデックスのUnicodeコードポイントを取得する

文字列の指定したインデックスの位置にある文字の Unicode コードポイントを取得するには String クラスで用意されている codePointAt メソッドを使用します。文字列は 0 個以上の複数の文字で構成されていますが、先頭から順番に 0 、 1 、 2 ...とインデックスが割り当てられています。ここでは Java で文字列の指定したインデックスの Unicode コードポイントを取得する方法について解説します。

(Last modified: )

String.codePointAtメソッドの使い方

文字列の指定したインデックスの位置にある文字の Unicode コードポイントを取得するには String クラスで用意されている codePointAt メソッドを使用します。書式は次のとおりです。

public int codePointAt(int index)

パラメータ:
index - char値へのインデックス

戻り値:
指定されたindexにある文字のコード・ポイント値

例外:
IndexOutOfBoundsException - index引数が負の値、または文字列の長さと同じかこれより大きい値の場合。

1 番目の引数に指定したインデックスの位置にある文字の Unicode コードポイントを、 int 型の値で戻り値として返します。

※ Unicode コードポイントとは、 Unicode で扱っているすべての文字に割り当てられたコードです。 Unicode コードポイントをどのように符号化するのかを定めているのが UTF-16 や UTF-8 です。

例えば文字列が "東京都港区赤坂" だった場合、それぞれの文字のインデックスは次のようになります。

String.codePointAtメソッドの使い方(1)

インデックスは最初の文字が 0 、次の文字が 1 、と先頭から順番に割り当てられています。インデックス 0 の文字は "東" 、インデックス 3 の文字は "港" です。

次のサンプルを見てください。

String msg = "東京都港区赤坂";

System.out.println(msg.codePointAt(0));  // 26481
System.out.println(msg.codePointAt(3));  // 28207

インデックス 0 の位置にある "東" の文字の Unicode コードポイントと、インデックス 3 の位置にある "港" の文字の Unicode コードポイントを取得しました。

サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample10-1.java という名前で保存します。

class JSample10_1{
  public static void main(String[] args){
    String msg = "東京都港区赤坂";

    for (int i = 0; i < msg.length(); i++){
      System.out.println( i + ";" + msg.codePointAt(i));
    }
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample10_1.java

その後で、次のように実行してください。

java JSample10_1

String.codePointAtメソッドの使い方(2)

文字列に含まれる文字を先頭から最後まで順番に取り出して Unicode コードポイントを取得し画面に表示しました。

サロゲートペアを使用する文字の場合

Java では内部的に文字を UTF-16 で保管しているため、サロゲートペアについて考慮する必要があります。サロゲートペアとは 1 つの文字を 2 つの文字コードで表す文字のことです。

サロゲートペアを使用する文字の場合、 UTF-16 文字コードでは 2 つ文字コードを使用しますが、 Unicode コードポイントでは 1 つのコードで表すことができます。

例えば "●" という文字はサロゲートペアを使用する文字ですが、 "●あ" という文字列のインデックスは次のようになります。

サロゲートペアを使用する文字の場合(1)

※ ● のところには次の文字が入ります。

サロゲートペアを使用する文字の場合(2)

このようにサロゲートペアを使用する文字はインデックスが 2 つありますが、この文字に対して codePointAt メソッドを使用する場合、最初のインデックスを指定すると該当の文字の Unicode コードポイントを返します。なお次のインデックスを指定すると、下位サロゲートの範囲の UTF-16 文字コードを返します。

次のサンプルを見てください。

String msg = "●あ";

System.out.println(msg.codePointAt(0));  // 173770
System.out.println(msg.codePointAt(1));  // 57034
System.out.println(msg.codePointAt(2));  // 12354

※ ● のところには次の文字が入ります。

サロゲートペアを使用する文字の場合(2)

サロゲートペアの文字に対する Unicode コードポイントを取得する場合は、最初のインデックスを指定して codePointAt メソッドを実行してください。

-- --

Java で文字列の指定したインデックスの Unicode コードポイントを取得する方法について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。