ヘッダー画像

JavaのUnicodeBlockについて調べてみた

投稿 2023年10月1日 最終更新 2023年10月1日 専門用語少なめ

UnicodeBlockとは?

文字列のUnicodeが、どういう種類なのか?

というのをJava上で分類したものになります。

例えば、日本語のひらがなだと

UnicodeBlock.HIRAGANA

のような形で表現されています。

判定方法

下記はJava17で確認しております。

また判定を行う前に、Unicode正規化しています。
※NFKC(互換分解後の正規合成)

ひらがな

import java.lang.Character.UnicodeBlock;
import java.text.Normalizer;
import java.text.Normalizer.Form;

public class UnicodeBlockTest {
  public static void main(String[] args) {
    String normalize = Normalizer.normalize("あ", Form.NFKC);
    boolean isHiragana = normalize.codePoints().anyMatch(
        point -> UnicodeBlock.HIRAGANA == UnicodeBlock.of(point)
    );
    // true
    System.out.println(isHiragana);
  }
}

カタカナ

import java.lang.Character.UnicodeBlock;
import java.text.Normalizer;
import java.text.Normalizer.Form;

public class UnicodeBlockTest {
  public static void main(String[] args) {
    String normalize = Normalizer.normalize("ア", Form.NFKC);
    boolean isKatakana = normalize.codePoints().anyMatch(
        point -> UnicodeBlock.KATAKANA == UnicodeBlock.of(point)
    );
    // true
    System.out.println(isKatakana);
  }
}

漢字(常用漢字2136文字)

import java.lang.Character.UnicodeBlock;
import java.text.Normalizer;
import java.text.Normalizer.Form;

public class UnicodeBlockTest {
  public static void main(String[] args) {
    String normalize = Normalizer.normalize("亜", Form.NFKC);
    boolean isKanji = normalize.codePoints().anyMatch(
        point -> UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS == UnicodeBlock.of(point)
    );
    // true
    System.out.println(isKanji);
  }
}

ややこしい…

そう思った方、いらっしゃるかと思います。

自分自身も思っています…

実際、これでもまだ簡単なほうなんです。。。

上記サンプルコードでは「codePoints」

というメソッドを使用していますが、
「chars」メソッドのほうが簡単に書けます。

ただ、漢字が想像を絶する量ありますし、
これから説明する「サロゲートペア」とか言う、
特殊な文字等があるため、対応できない文字もあります。

特殊文字

Unicodeとは?

この世には様々な文字コードがあります。

世界中で各国の言語に文字コードを付けてきたわけです。

そうすると、文字コードによって表す文字が違ったりします。

それじゃ困る。

そこで生まれたのがUnicodeです。

Unicodeとは世界中の文字に、共通の番号を付けたものです。

Unicodeの問題点

Unicodeを広めた時点では、
16bit(=65536種)ですべての文字を表現できる
と思っていました。

結果、足りませんでした。

その対策として出てきたのが、「サロゲートペア」です。

サロゲートペアとは?

2文字分の領域を組み合わせて、1文字を表現しようという仕組みです。

決められた数字があれば、もう1文字分読み込んで、
2つ合わせて1文字として認識させるという事です。

常用漢字(2136文字)中、1文字だけサロゲートペアがありました。

「𠮟」です。

「chars」だとこの文字だけが、ちゃんと判定できませんでした。

その他

異体字シーケンスだったり結合文字列だったり、
は「codePoints」でも判定できないです。

結論…ややこしすぎます。

GitHubにもメソッド版を上げています。

そちらも参考にどうぞ。

まとめ

文字コードやUnicode、ややこしいなとは思ってましたが、
改めて調べると、余計ややこしいという事がわかりました。

プログラムやってたら、絶対1回は文字コード関係でつまづきますよね。

以上、ここまで見ていただきありがとうございます。

皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。

コメント

この記事のコメントはありません。