查看原文
其他

Java 21 增强对 Emoji 表情符号的处理了

DD 程序猿DD 2023-11-28

发现一个 Java 21 中有意思的东西!在java.Lang.Character类中增加了用于确定字符是否为 Emoji 表情符号的 API,主要包含下面六个新的静态方法:

public static boolean isEmoji(int codePoint) {
  return CharacterData.of(codePoint).isEmoji(codePoint);
}

public static boolean isEmojiPresentation(int codePoint) {
  return CharacterData.of(codePoint).isEmojiPresentation(codePoint);
}

public static boolean isEmojiModifier(int codePoint) {
  return CharacterData.of(codePoint).isEmojiModifier(codePoint);
}

public static boolean isEmojiModifierBase(int codePoint) {
  return CharacterData.of(codePoint).isEmojiModifierBase(codePoint);
}
  
public static boolean isEmojiComponent(int codePoint) {
  return CharacterData.of(codePoint).isEmojiComponent(codePoint);
}

public static boolean isExtendedPictographic(int codePoint) {
  return CharacterData.of(codePoint).isExtendedPictographic(codePoint);
}

这些静态方法通过接收字符的codePoint来判断是否为表情符号来返回boolean值。

所以,我们可以用isEmoji方法来判断字符串中是否有表情,比如:

@Test
void testEmoji() {
  String message = "欢迎来到 www.didispace.com ❤️,要不要来杯 ☕️ ?";
  if(message.codePoints().anyMatch(Character::isEmoji)) {
    System.out.println("Message包含表情");
  }
}

除了判断字符串中是否包含表情符号之外,还能用isEmojiModifierisEmojiModifierBase来判断Emoji是否被修改和是否可以被修改:

@Test
void testEmoji2() {
  String welcomeMsg ="欢迎来到 www.didispace.com ❤️,要不要来杯 ☕️ ?";
  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 present");
}


这些新方法也可以通过属性构造正则表达式来使用,比如:

String welcomeMsg = "欢迎来到 www.didispace.com ❤️,要不要来杯 ☕️ ?";

Matcher matcher = Pattern.compile("\\p{IsEmoji}").matcher(welcomeMsg);

if(matcher.find()) {
 System.out.println("Message contains an emoji!");
}

matcher = Pattern.compile("\\p{IsEmoji_Modifier_Base}").matcher(welcomeMsg);

if(matcher.find()) {
 System.out.println("Message contains an emoji modifier base!");
}


欢迎关注博客连载的Java新特性专栏:https://www.didispace.com/java-features/


你还在购买国内的各种昂贵又低质的技术教程吗?这里给大家推荐下我们自研的Youtube视频语音转换插件(https://youtube-dubbing.com/),一键外语转中文,英语不好的小伙伴也可以轻松的学习油管上的优质教程了,下面是演示视频,可以直观的感受一下:


------
我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。

推荐阅读

··································

点击卡片关注我,分享一线前沿干货

点击阅读原文,直达Java新特性专栏
继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存