随着社交网络的流行,emoji 表情已经成为了人们表达情感的重要方式。在前端开发中,我们经常需要对输入的文本进行 emoji 表情的匹配和处理。在 ECMAScript 2019 中,我们可以使用新的 Unicode 相关 API 来实现这个功能。
Unicode
Unicode 是一种字符编码方案,它定义了世界上几乎所有的字符和符号,并为它们分配了唯一的数字编码。Unicode 的编码范围是从 U+0000 到 U+10FFFF,其中 U+0000 到 U+FFFF 被称为基本多文种平面(BMP),其余部分被称为辅助平面。
在 Unicode 中,每个字符都有一个对应的代码点(code point),代码点是一个唯一的整数,用来表示某个字符或符号。例如,字母 A 的代码点是 U+0041,中文汉字「你好」的代码点是 U+4F60 和 U+597D。
String.prototype.normalize()
在 ECMAScript 2015 中,引入了一个新的字符串方法 normalize()
,用来将字符串中的所有字符都转换成相同的形式,以便于比较和处理。它可以接受一个参数,用来指定归一化的方式,常用的有四种方式:
- NFC:使用最少的 Unicode 码位来表示等价的字符,是默认值。
- NFD:将每个字符拆分成组合字符的形式。
- NFKC:使用最少的 Unicode 码位来表示等价的字符,并将兼容字符转换成等价字符。
- NFKD:将每个字符拆分成组合字符的形式,并将兼容字符转换成等价字符。
对于 emoji 表情,由于它们通常由多个 Unicode 字符组成,所以我们需要先对输入的字符串进行归一化,以便于后续的匹配和处理。
const emoji = '👩👩👧👧'; const normalized = emoji.normalize(); // 👩👩👧👧
RegExp.prototype.unicode
在 ECMAScript 2018 中,引入了一个新的标志符 u
,用来启用 Unicode 匹配模式。在这个模式下,正则表达式会将字符串视为由 Unicode 码位组成的序列,而不是由单个字符组成的序列。
在 ECMAScript 2019 中,这个标志符被扩展成了一个属性 unicode
,用来判断正则表达式是否启用了 Unicode 匹配模式。当这个属性为 true 时,正则表达式会将字符串视为 Unicode 码位的序列进行匹配。
对于 emoji 表情,我们可以使用正则表达式来匹配其中的 Unicode 码位序列。例如,下面的正则表达式可以匹配所有的笑脸 emoji:
const regex = /[\u{1F600}-\u{1F64F}]/u;
其中 \u{1F600}
和 \u{1F64F}
分别表示笑脸 emoji 的第一个和最后一个 Unicode 码位。这个正则表达式可以匹配所有的笑脸 emoji,包括单个码位的和多个码位的。
const emoji = '😀🤣😊🙂😉😍😘🥰😜😝😛'; const regex = /[\u{1F600}-\u{1F64F}]/u; const matches = emoji.match(regex); // ['😀', '🤣', '😊', '🙂', '😉', '😍', '😘', '🥰', '😜', '😝', '😛']
总结
在 ECMAScript 2019 中,我们可以使用 normalize()
方法将输入的字符串归一化,然后使用正则表达式和 unicode
属性来匹配其中的 emoji 表情。这个方法适用于所有的 Unicode 字符,而不仅仅是 emoji 表情。
以下是一个完整的示例代码:
const emoji = '👩👩👧👧'; const normalized = emoji.normalize(); // 👩👩👧👧 const regex = /[\u{1F600}-\u{1F64F}]/u; const matches = normalized.match(regex); // null const smileys = '😀🤣😊🙂😉😍😘🥰😜😝😛'; const normalizedSmileys = smileys.normalize(); // 😀🤣😊🙂😉😍😘🥰😜😝😛 const smileysRegex = /[\u{1F600}-\u{1F64F}]/u; const smileysMatches = normalizedSmileys.match(smileysRegex); // ['😀', '🤣', '😊', '🙂', '😉', '😍', '😘', '🥰', '😜', '😝', '😛']
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/658e96c2eb4cecbf2d476be6