顶答案对“如何使用javascript检测表情符号”的问题使用Extended_Pictographic
。
Emoji_Presentation
在本大卫·沃尔什的博客文章中有提及。
发布于 2022-06-23 09:35:26
一个关键的区别是,Extended_Pictographic
将匹配一组“象形文字”字符,这些字符在技术上不是表情符号,或者默认情况下不显示为彩色表情符号:
"1♡⌨︎".match(/\p{Emoji_Presentation}/gu) // ['', '']
"1♡⌨︎".match(/\p{Extended_Pictographic}/gu) // ['', '', '♡', '⌨︎']
\p{Emoji_Presentation}
只匹配默认情况下以彩色表情符号形式显示的表情符号。
也有\p{Emoji}
,但在大多数现实世界中最好避免这样做:
"1♡⌨︎".match(/\p{Emoji}/gu) // ['1', '', '', '⌨︎']
IIUC,1
有一个表情符号/有色表示(1️⃣),所以是由\p{Emoji}
匹配的,但是默认情况下1
没有以它的表情符号/有色形式显示,所以它不被\p{Emoji_Presentation}
匹配。⌨︎
也是如此。我想♡
根本没有被归类为表情符号,而是属于“象形文字”类。
请注意,上面的解释意味着一个表情符号可以是彩色的,但却不能被\p{Emoji_Presentation}
匹配。例如,❄️是一个默认以黑白显示的“旧”表情符号。您看到它着色的原因是因为它后面有特殊的“变体选择器16”(\uFE0F
),这使得它以彩色的形式呈现。如果您想要匹配字符串中的所有颜色的表情符号,而不管它们的“默认”表示是什么,那么我认为这应该是可行的:
"1♡⌨︎❄️".match(/(\p{Emoji}\uFE0F|\p{Emoji_Presentation})/gu) // ['', '', '❄️']
\p{Emoji}\uFE0F
部分是导致上述正则表达式与雪花匹配的原因。注意,在上面的代码块中,雪花被呈现为黑白,但这只是CSS相关的事情,因为它在一个代码块中。
发布于 2021-12-19 16:36:46
象形文字性质是在Unicode技术标准51,Unicode中定义的,主要用于断线和其他分割算法。
表示属性也在UTS #51中定义。创建它是为了帮助应用程序在遇到某些Unicode字符时选择默认的表示形式:单色文本或全色表情符号。之所以需要这样做,是因为在第一次编码表情符号时,决定将日本使用的表情符号与现有的Unicode字符统一起来,当有一个与表情符号匹配的现有字符时。(事后看来,由于这个问题,这可能不是最好的决定。)
注意,Extended_Pictographic是Unicode代码点的属性,有些代码点还没有分配给任何字符。您可以看到按Extended_Pictographic (字符)属性值在Presentation&i=上分组的所有Presentation&i=代码点的列表。(这显示了它们按块分组。)
https://stackoverflow.com/questions/70401560
复制相似问题