La respuesta principal a la pregunta "Cómo detectar emoji usando javascript" usa Extended_Pictographic .
Emoji_Presentation se menciona en esta entrada de blog de David Walsh .
La propiedad Extended_Pictographic se define en Unicode Technical Standard #51, Unicode Emoji, y está pensada principalmente para usarse en saltos de línea y otros algoritmos de segmentación.
La propiedad Emoji_Presentation también se define en UTS #51. Fue creado para ayudar a las aplicaciones a elegir una presentación predeterminada cuando encuentran ciertos caracteres Unicode: como texto monocromático o como emoji a todo color. La necesidad de esto surgió como resultado de una decisión que se tomó cuando se codificaron los emoji por primera vez para unificar los emoji usados en Japón con los caracteres Unicode existentes cuando había un carácter existente que coincidía con un emoji. (En retrospectiva, esa podría no haber sido la mejor decisión debido a este problema).
Tenga en cuenta que Extended_Pictographic es una propiedad de los puntos de código Unicode y que hay puntos de código que (todavía) no están asignados a ningún carácter. Puede ver una lista de todos los puntos de código de Extended_Pictographic agrupados por sus valores de propiedad de Emoji_Presentation (carácter) en https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp?a=%5B%3AExtended_Pictographic%3A%5D&g=Emoji_Presentation&i = . (Esto los muestra subagrupados por bloques).
Una diferencia clave es que Extended_Pictographic coincidirá con un montón de caracteres "pictográficos" que técnicamente no son emojis, o que no se muestran como emojis de colores de forma predeterminada:
"1😂💯♡⌨︎".match(/\p{Emoji_Presentation}/gu) // ['😂', '💯'] "1😂💯♡⌨︎".match(/\p{Extended_Pictographic}/gu) // ['😂', '💯', '♡', '⌨︎'] \p{Emoji_Presentation} solo coincide con emojis que, de forma predeterminada, se muestran en su forma de emoji de color.
También está \p{Emoji} , pero es mejor evitarlo en la mayoría de las circunstancias del mundo real:
"1😂💯♡⌨︎".match(/\p{Emoji}/gu) // ['1', '😂', '💯', '⌨︎'] IIUC, 1 tiene una representación emoji/coloreada (1️⃣), por lo que coincide con \p{Emoji} , pero 1 no se muestra en su forma emoji/coloreada de forma predeterminada, por lo que no coincide con \p{Emoji_Presentation} . Lo mismo con ⌨︎ . Y supongo que ♡ no está clasificado como un emoji en absoluto, pero cae dentro de la clase "pictográfica".
Tenga en cuenta que la explicación anterior implica que un emoji se puede colorear y, sin embargo, no coincidir con \p{Emoji_Presentation} . Por ejemplo, ❄️ es un emoji "antiguo" que se muestra en blanco y negro de forma predeterminada. La razón por la que lo ve coloreado es porque tiene el "selector de variación 16" especial ( \uFE0F ) después de él, lo que lo hace aparecer en forma coloreada. Si desea hacer coincidir todos los emojis de colores en una cadena, independientemente de su presentación "predeterminada", creo que esto debería funcionar:
"1😂💯♡⌨︎❄️".match(/(\p{Emoji}\uFE0F|\p{Emoji_Presentation})/gu) // ['😂', '💯', '❄️'] La parte \p{Emoji}\uFE0F es lo que hace que la expresión regular anterior coincida con el copo de nieve. Tenga en cuenta que en el bloque de código anterior, el copo de nieve se representa en blanco y negro, pero eso es solo algo relacionado con CSS debido a que está en un bloque de código.