原文はこちら。
The original article was written by Billy Korando (Developer Advocate at Oracle).
https://inside.java/2023/11/20/sip089/
Java開発者の皆さん、朗報です!Java 21で絵文字のサポートが改善されました。
Emojitional Support
Java 20までは、Characterが絵文字であるかどうかを評価する標準APIはありませんでした。たとえこの情報がJDKに含まれるCLDRデータでこの文字が絵文字である、という情報が利用可能であったとしてもです。しかしながら、絵文字の使用がますます一般的になってきたため、JDK-8303018を作成して、java.lang.CharacterにAPIを追加し、Java開発者が絵文字が使用されているかどうかをチェックできるようにしました。
[JDK-8303018] Unicode Emoji Properties
https://bugs.openjdk.org/browse/JDK-8303018
Unicode Emoji Properties (JDK-8303018)
https://www.oracle.com/java/technologies/javase/21-relnote-issues.html#JDK-8303018
Character API Updates
JDK-8303018では以下の6個の新規メソッドをjava.lang.Characterに追加しました。
public static boolean isEmoji(int codePoint)
public static boolean isEmojiPresentation(int codePoint)
public static boolean isEmojiModifier(int codePoint)
public static boolean isEmojiModifierBase(int codePoint)
public static boolean isEmojiComponent(int codePoint)
public static boolean isExtendedPictographic(int codePoint)
これらの6個の新規メソッドはstaticで文字のint型のcodePoint値を取り、boolean値を返します。基本的なレベルでは、isEmoji(int)を使って、Characterが絵文字であるかどうかをチェックできます。他のメソッドは、絵文字がどのようにレンダリングされるべきかについての情報を提供するために使用できます。
Using the Emoji API
この新しいemoji APIを直接利用できます。以下の例は、StringをIntStreamに変換してemojiが含まれているかどうか、を評価しています。
String welcomeMsg = "Hey Java Developers! ☕️";
if(welcomeMsg.codePoints().anyMatch(Character::isEmoji)) {
System.out.println("Message contains an emoji!");
}
isEmojiModifierBaseとisEmojiModifierを使って絵文字が変更可能かどうか、変更済みかどうかを確認できます。この例では、絵文字”🙋🏻♂️”は、変更が適用されたベース絵文字です:
String welcomeMsg = "Hey Java Developers! 🙋🏻♂️";
OptionalInt emojiOptional = welcomeMsg.codePoints().filter(Character::isEmoji).findFirst();
if (emojiOptional.isPresent()) {
int emojiCodePoint = emojiOptional.getAsInt();
if (Character.isEmojiModifierBase(emojiCodePoint)) {
System.out.println("Emoji can be modified");
if (Character.isEmojiModifier(emojiCodePoint)) {
System.out.println("Emoji is modified");
} else {
System.out.println("Emoji has not been modified");
}
} else {
System.out.println("Emoji cannot be modified");
}
} else {
System.out.println("No emoji");
}
Emoji API Support in Regex
これらの新しいメソッドは、次の例のように、プロパティ構文\p{IsXXXX}を使って正規表現でもアクセスできます。
String welcomeMsg = "Hey Java Developers! ☕️";
Matcher matcher = Pattern.compile("\\p{IsEmoji}").matcher(welcomeMsg);
if(matcher.find()) {
System.out.println("Message contains an emoji!");
}
プロパティ構文では、変更版スネークケースを使用してメソッド参照していることに注意してください。以下はその例です。
String welcomeMsg = "Hey Java Developers! 🙋♂️";
Matcher matcher = Pattern.compile("\\p{IsEmoji_Modifier_Base}").matcher(welcomeMsg);
if(matcher.find()) {
System.out.println("Message contains an emoji modifier base!");
}
Additional Reading
[JDK-8303018] Unicode Emoji Properties
https://bugs.openjdk.org/browse/JDK-8303018
JDK 21 JavaDoc for java.lang.Character
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Character.html
Unicode® Technical Standard #51: Unicode Emoji
https://unicode.org/reports/tr51/#Emoji_Properties_and_Data_Files