はじめに
サロゲートペア(サロゲートペア文字、Surrogate Pair)は、Unicode文字を扱う際に重要な概念です。特に、多言語対応や絵文字の処理が必要な場合に知っておくべき知識です。
Unicodeとサロゲートペアの基本
Unicodeの基本
Unicodeは、世界中の文字や記号を一貫して表現するための標準です。各文字には一意のコードポイントが割り当てられており、通常は16ビット(2バイト)で表現されます。しかし、すべての文字を16ビットで表現するには限界があり、基本多言語面(BMP、Basic Multilingual Plane)に収まらない文字も存在します。
サロゲートペアの必要性
BMPには、U+0000からU+FFFFまでの65,536個のコードポイントが含まれています。しかし、Unicodeにはそれを超えるコードポイントが必要です。そこで、U+10000からU+10FFFFまでのコードポイントを表現するために、サロゲートペアが導入されました。
サロゲートペアは、2つの16ビットのコードユニットを組み合わせて1つの文字を表現します。これにより、1,048,576個の追加コードポイント(約104万個)を表現できるようになります。
サロゲートペアの構造
サロゲートペアは次の2つの部分から構成されます。
- 上位サロゲート(High Surrogate): U+D800からU+DBFFまでの範囲
- 下位サロゲート(Low Surrogate): U+DC00からU+DFFFまでの範囲
これらを組み合わせて、BMP外の文字(補助平面、Supplementary Planes)のコードポイントを表現します。
Javaでのサロゲートペアの扱い方
基本的な文字操作
Javaでは、char
型は16ビットのUTF-16コードユニットを表現します。そのため、BMP内の文字は1つのchar
で表現できますが、BMP外の文字はサロゲートペアを使用する必要があります。
サロゲートペアの検出
サロゲートペアを検出するには、Character
クラスのメソッドを使用します。
public class SurrogatePairExample {
public static void main(String[] args) {
String str = "A𐍈B"; // '𐍈'はサロゲートペアを必要とする文字
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if (Character.isHighSurrogate(ch)) {
System.out.println("High Surrogate: " + ch);
} else if (Character.isLowSurrogate(ch)) {
System.out.println("Low Surrogate: " + ch);
} else {
System.out.println("Regular character: " + ch);
}
}
}
}
コードポイントの扱い
Javaでは、サロゲートペアを処理するためにコードポイントを使用することが推奨されます。String
クラスとCharacter
クラスには、コードポイントを扱うためのメソッドが多数用意されています。
public class CodePointExample {
public static void main(String[] args) {
String str = "A𐍈B";
// コードポイントの取得
int codePoint = str.codePointAt(1);
System.out.println("Code point: " + Integer.toHexString(codePoint));
// コードポイント数
int codePointCount = str.codePointCount(0, str.length());
System.out.println("Code point count: " + codePointCount);
// コードポイントの配列を取得
int[] codePoints = str.codePoints().toArray();
for (int cp : codePoints) {
System.out.println("Code point: " + Integer.toHexString(cp));
}
}
}
文字列の操作
サロゲートペアを含む文字列の操作には注意が必要です。例えば、文字列の逆順操作を行う場合、サロゲートペアを適切に扱う必要があります。
public class ReverseStringExample {
public static void main(String[] args) {
String str = "A𐍈B";
String reversedStr = new StringBuilder(str).reverse().toString();
System.out.println("Reversed string: " + reversedStr);
}
}
上記のコードでは、StringBuilder
のreverse()
メソッドがサロゲートペアを適切に処理しますが、自前で逆順操作を実装する場合には注意が必要です。
まとめ
サロゲートペアは、BMP外のUnicode文字を表現するための重要な仕組みです。Javaでは、サロゲートペアを適切に処理するために、Character
クラスとString
クラスのメソッドを活用することが推奨されます。