Java 21 中改进的表情符号支持 - 一口 Java

Java 开发人员的好消息,Java 21 中的表情符号支持得到了改进。我们来看看吧!

表情符号支持

在 Java 21 之前,没有用于评估 Character 是否为表情符号的标准 API,即使此信息包含在 JDK 中的 CLDR 数据中。随着表情符号的使用变得越来越普遍,JDK-8303018 被创建,用于向 java.lang.Character 添加 API,以使 Java 开发人员能够检查是否使用了表情符号。

Character API 更新

JDK-8303018 向 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)

所有六个新方法都是 static,获取字符的 int codePoint 值,并返回 boolean 值。在基本级别上,isEmoji(int) 可用于检查 Character 是否为表情符号;其他方法可用于提供有关如何渲染表情符号的信息。

使用表情符号 API

新表情符号 API 可以直接使用,如下面的示例代码所示,将 String 转换为 IntStream 并评估它是否包含表情符号

String welcomeMsg = "Hey Java Developers! ☕️";

if(welcomeMsg.codePoints().anyMatch(Character::isEmoji)) {
	System.out.println("Message contains an emoji!");
}

isEmojiModifierBaseisEmojiModifier 可用于查看表情符号是否可以修改以及是否已修改;在此示例中,表情符号“🙋🏻‍♂️”是一个已应用修改的基本表情符号:️

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");
}

正则表达式中的表情符号 API 支持

这些新方法还可以通过属性构造 \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!");
}

其他阅读材料

JBS 问题 JDK-8303018

java.lang.Character 的 JDK 21 JavaDoc

Unicode® 技术标准 #51

编码愉快!