'❌'[0] === '❌' // true '✔️'[0] === '✔️' // false '✔️'[0] === '✔' // trueSospecho que está relacionado con Unicode, pero me gustaría entender con precisión qué está sucediendo y cómo puedo comparar correctamente dichos caracteres. ¿Por qué '✔️' se trata de manera diferente a '❌'?
Lo encontré en este simple conteo de caracteres.
'✔️❌✔️❌'.split('').filter(e => e === '❌').length // 2 '✔️❌✔️❌'.split('').filter(e => e === '✔️').length // 0Porque ✔️ toma dos caracteres: "✔️".length === 2
"✔️"[0] === "✔" y "✔️"[1] denota color, creo.
Y "❌".length === 1 para que solo tome un carácter.
Es similar a la forma en que funcionan los emojis con diferentes colores de piel.
En cuanto a cómo comparar, creo que "✔️".codePointAt(0) (no confundir con charCodeAt() ) podría ayudar. Consulte https://thekevinscott.com/emojis-in-javascript/ :
codePointAt y fromCodePoint son métodos nuevos introducidos en ES2015 que pueden manejar caracteres Unicode cuya codificación UTF-16 es mayor a 16 bits, lo que incluye emojis. Úselos en lugar de charCodeAt, que no maneja los emoji correctamente.
Creo que el '✔️' se compone de 2 componentes. Cuando genera '✔️'[0], obtiene '✔', y la marca de verificación negra no es igual a la marca de verificación verde.
Sin embargo, el '❌' se compone de un solo componente, por lo que cuando genera '❌'[0], obtiene lo mismo: '❌'.
El segundo carácter '✔️'[1] (punto de código = 65039) es un Variation Selector
Un selector de variación especifica que el carácter anterior debe mostrarse con una presentación emoji. Solo se requiere si el carácter anterior tiene como valor predeterminado la presentación de texto.
A menudo se usa en Secuencias de Emoji ZWJ, donde uno o más caracteres en la secuencia tienen una presentación de texto y emoji, pero por lo demás se muestran de forma predeterminada en texto (blanco y negro).
Ejemplos Muñeco de nieve como texto: ☃. Muñeco de nieve como Emoji: ☃️
Corazón negro como texto: ❤. Corazón Negro como Emoji: ❤️ (no tan negro)
Variation Selector-16 fue aprobado como parte de Unicode 3.2 en 2002.