表情符号的节日问候

作者: Paul King
发布时间: 2023-12-23 12:24PM (最后更新: 2024-01-19 10:15PM)


在之前的博客文章 ,我们探讨了使用 Groovy 和表情符号编写hello world 脚本的一种有趣方式。

让我们来看看 JDK 21 中提供的其他表情符号 API 调用。我们使用的是 Groovy 5.0.0-alpha-5,但大多数示例在最近的 Groovy 4 版本中也能正常工作。Groovy 5 添加了一个快捷方式,使其更容易将代码点获取为数组。

JDK 21 新特性

作为 JDK-8303018 的一部分,JDK 21 向 java.lang.Character 添加了以下 API 调用

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)

此外,在使用以下特殊二进制属性执行正则表达式匹配时,也添加了等效的功能

  • \p{IsEmoji}

  • \p{IsEmoji_Presentation}

  • \p{IsEmoji_Modifier}

  • \p{IsEmoji_Modifier_Base}

  • \p{IsEmoji_Component}

  • \p{IsExtended_Pictographic}

让我们看看如何在 Groovy 中使用这些功能。

使用 Groovy 玩转表情符号

首先,我们来看一个包含 3 个表情符号的字符串:圣诞树、圣诞老太婆和圣诞老人。我们将使用新的 API 调用之一来检查该字符串的 3 个 Unicode 代码点是否都对应于表情符号

using isEmoji

我们也可以使用新添加的正则表达式二进制属性来进行检查。Groovy 正则表达式运算符 (==~) 确保字符串完全匹配 3 个表情符号

using isEmoji

Unicode 支持通过对 Unicode 字符进行排序来进行各种形式的修改。最简单的示例之一是当某些“基本”表情符号字符后面跟着一个肤色表情符号修饰符时。这两个连续字符被重新解释,产生一个具有肤色的单个表情符号。

我们将看到圣诞树不能用作表情符号修饰符基,但两个克劳斯表情符号可以。此外,我们还可以看到,所有 5 个肤色表情符号字符都可以用作表情符号修饰符

using isEmoji

让我们尝试一些组合。我们将把圣诞老人表情符号与一些肤色相结合。根据您的 IDE/编辑器,您可能只会看到一个表情符号,但它是由多个 Unicode 代码点组成的。

如果我们查看“单个”表情符号的代码点,它将与“裸”圣诞老人表情符号的代码点相同,加上肤色表情符号的代码点

using isEmoji

我们还使用正则表达式检查表情符号角色。我们可以看到基底后面跟着修饰符。

我们可以把所有这些放在一起,检查所有 5 个带肤色的圣诞老人,如下所示

using isEmoji

Unicode 提供的另一个排序技巧是将相关的表情符号组合起来,形成新的表情符号,并在它们之间插入一个零宽度连接符 (ZWJ)。例如,您可以将女性表情符号“👩”与可能的额外肤色表情符号组合起来,然后是一个 ZWJ 字符(十六进制为 Unicode 200D),后面跟着火箭表情符号“🚀”,组合起来就形成了女宇航员表情符号“👩🏽‍🚀”。

Unicode 有一个特殊的 Mx 克劳斯表情符号,可以用来表示圣诞老太婆或圣诞老人的性别中立替代品,或者表示有浓厚圣诞精神的人。它将成人表情符号“🧑”、ZWJ 字符和圣诞树表情符号组合在一起。

同样,如果我们查看代码点,我们会发现“组合”表情符号的代码点只是各个组件的代码点依次排列,如第一行所示。第二行显示了如何使用 Unicode 输入组合表情符号。第一部分和最后部分表示为代理对,它们会自动组合成正确的代码点。

using isEmoji

最后两行展示了如何使用正则表达式检查组合表情符号。我们可以使用正则表达式的\x{…​} 表示法检查确切的 Unicode 字符,注意我们不使用代理对。我们也可以使用\N{…​} 表示法检查表情符号名称。

组合并不局限于大小为 2 的组合。可能的“家庭”表情符号组合之一结合了 3 个表情符号,并在它们之间插入 ZWJ 字符。

using isEmoji

我们可以执行与之前类似的正则表达式检查,检查确切的 Unicode 值或名称。

作为最后一个示例,让我们看看“🙋🏻‍♀️”表情符号。查看下面代码的第一行可能会让我们误以为我们组合了三个字符,但检查大小显示组合表情符号有 5 个部分。第一个和最后一个表情符号已经是组合的。 “🙋🏻”表情符号将一个基本表情符号与一个肤色相结合。“♀️”表情符号将女性符号字符“♀”与一个特殊的变体选择器 字符相结合,该字符表示应该将前面的字符视为表情符号而不是字符。

using isEmoji

我们可以通过检查组合表情符号每个部分的各种属性来测试新的表情符号 API 调用。

我们可以使用正则表达式执行类似的检查。我们可以检查 Unicode 字符的完全匹配,通过它们的 emoji 名称,或者通过每个部分所扮演的角色,如下所示

using isEmoji

我们希望您喜欢这次对 JDK 21 新表情符号功能的探索。

哦,对了,祝大家节日快乐 🎄🎅☃️🎁🌟🎉!

更多信息

更新历史

2024 年 1 月 19 日:将 Groovy 从 5.0.0-alpha-4 升级到 5.0.0-alpha-5。