JavaのUnicodeBlockについて調べてみた
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回は文字コード関係でつまづきますよね。
以上、ここまで見ていただきありがとうございます。
皆さまの快適な開発ライフに、ほんの少しでもお役に立てれば幸いです。