{Emoji_Presentation} 和 {Extended_Pictographic} 有什么区别?

Oll*_*ams 14 javascript emoji

“如何使用 javascript 检测表情符号”问题的最佳答案Extended_Pictographic使用.

Emoji_PresentationDavid Walsh在这篇博文中提到了。

joe*_*joe 21

一个关键的区别是,Extended_Pictographic它将匹配一堆技术上不是表情符号的“象形”字符,或者默认情况下不显示为彩色表情符号:

\n
"1\xe2\x99\xa1\xe2\x8c\xa8\xef\xb8\x8e".match(/\\p{Emoji_Presentation}/gu)    // [\'\', \'\']\n"1\xe2\x99\xa1\xe2\x8c\xa8\xef\xb8\x8e".match(/\\p{Extended_Pictographic}/gu) // [\'\', \'\', \'\xe2\x99\xa1\', \'\xe2\x8c\xa8\xef\xb8\x8e\']\n
Run Code Online (Sandbox Code Playgroud)\n

\\p{Emoji_Presentation}仅匹配默认情况下以彩色表情符号形式显示的表情符号。

\n

还有\\p{Emoji},但在大多数现实情况下最好避免:

\n
"1\xe2\x99\xa1\xe2\x8c\xa8\xef\xb8\x8e".match(/\\p{Emoji}/gu) // [\'1\', \'\', \'\', \'\xe2\x8c\xa8\xef\xb8\x8e\']\n
Run Code Online (Sandbox Code Playgroud)\n

IIUC,1具有表情符号/彩色表示 (1\xef\xb8\x8f\xe2\x83\xa3),因此与 匹配\\p{Emoji},但1默认情况下不以其表情符号/彩色形式显示,因此它是\' t 匹配\\p{Emoji_Presentation}. 与 相同\xe2\x8c\xa8\xef\xb8\x8e。我猜\xe2\x99\xa1根本不属于表情符号,但确实属于“象形”类别。

\n

请注意,上述解释意味着表情符号可以是彩色的,但不能与 匹配\\p{Emoji_Presentation}。例如,\xe2\x9d\x84\xef\xb8\x8f 是一个“旧”表情符号,默认情况下以黑白显示。您看到它是彩色的原因是因为它\\uFE0F后面有特殊的“变化选择器 16”( ),这使得它以彩色形式呈现。如果您想匹配字符串中的所有彩色表情符号,无论它们的“默认”呈现如何,那么我认为这应该可行:

\n
"1\xe2\x99\xa1\xe2\x8c\xa8\xef\xb8\x8e\xe2\x9d\x84\xef\xb8\x8f".match(/(\\p{Emoji}\\uFE0F|\\p{Emoji_Presentation})/gu) // [\'\', \'\', \'\xe2\x9d\x84\xef\xb8\x8f\']\n
Run Code Online (Sandbox Code Playgroud)\n

\\p{Emoji}\\uFE0F部分是导致上述正则表达式匹配雪花的原因。请注意,在上面的代码块中,雪花被渲染为黑白,但这只是与 CSS 相关的事情,因为它位于代码块中。

\n


Pet*_*ble 5

Extended_Pictography属性在 Unicode 技术标准 #51、Unicode Emoji 中定义,主要用于换行和其他分段算法。

Emoji_Presentation属性也在 UTS #51 中定义。它的创建是为了帮助应用程序在遇到某些 Unicode 字符时选择默认表示形式:单色文本或全彩表情符号。之所以需要这样做,是因为在首次对表情符号进行编码时做出了一项决定,即当存在与表情符号匹配的现有字符时,将日本使用的表情符号与现有的 Unicode 字符统一起来。(事后看来,由于这个问题,这可能不是最好的决定。)

请注意,Extended_Pictgraphic 是 Unicode代码点的一个属性,并且有些代码点(尚未)分配给任何字符。您可以在https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp?a=%5B%3AExtended_Pictographic%3A%5D&g=Emoji_Presentation&i查看按 Emoji_Presentation(字符)属性值分组的所有 Extended_Pictographic 代码点的列表=。(这显示它们按块分组。)