Emoji bajo el capó

imagen




Durante las últimas semanas, Nikita Prokopov ha estado implementando soporte emoji para Skija . Decidió compartir algunos pequeños detalles de cómo esta "mayor innovación en la comunicación humana desde la invención de la letra imagen" funciona bajo el capó.



Nota del traductor: Habr no admite emoji, así que tuve que salir y reemplazar emoji con imágenes.



Unicode



Cada carácter de una computadora está codificado con un número. La codificación más popular es Unicode y las dos subvariantes más comunes son UTF-8 y UTF-16.



Unicode asigna 2 21 (2 millones) de caracteres llamados "puntos de código". De estos dos millones, solo ~ 150.000 caracteres están definidos actualmente. Todos los idiomas, muertos y vivos, y otras decoraciones se apiñaron en estos 150.000 símbolos. Se pueden utilizar diferentes tipos al revés de escritura y al revés: imagenasí como a mostrar «GHz» como un único glifo: imagen.



Dirigida a la flecha de dos puntas derecha con las plumas y dos líneas verticales: imageno Semiglazov Monster: imagen. Y el pato:



imagen




Preste atención al bloque con jeroglíficos egipcios (U + 13000 - U + 1342F), hay muchas cosas interesantes:



imagen




Emoji básico



Los emoji son solo caracteres Unicode, que se encuentran aquí U + 1F300-1F6FF y aquí U + 1F900-1FAFF:



imagen




Los emoji se comportan como letras ordinarias, puedes hacer todas las operaciones con ellos, como con las letras ( traducido aproximadamente: ¡pero no en Habré! ). Cuando escribe "A", la computadora ve U + 0041. Cuando escribe, la imagencomputadora ve U + 1F335.



Los emoji son fuentes



¿Por qué se muestran como imágenes? Fuentes de mapa de bits. Puede crear png divertidos para glifos en lugar de aburridos vectores en blanco y negro.



imagen



Cada sistema operativo viene con una fuente emoji preinstalada. En macOS / iOS, este es el Apple Color Emoji. Windows - Segoe UI Emoji, Android - Noto Color Emoji.



Los emojis, como las fuentes, se ven diferentes en diferentes dispositivos. Algunas aplicaciones tienen su propio emoji: WhatsApp, Twitter, Facebook.



imagen



Fuentes de reserva



Escribes el texto con alguna fuente, ¿cómo encaja el emoji allí? ¿Y por qué el texto en ruso se ve pobre en el Clubhouse o en Medium?



imagen




Aquí está escribiendo el carácter U + 1F419 y su fuente es, por ejemplo, San Francisco. Pero la fuente San Francisco no tiene un glifo para U + 1F419, por lo que su sistema operativo comienza a buscar otra fuente que tenga ese glifo.



U + 1F419 solo está disponible en Apple Color Emoji. Así que ya ves esto: imagen.

Cualquiera que sea la fuente que uses, los emojis tienen el mismo aspecto.



imagen




Selector de variación-16



Algunos emojis se originaron en forma de íconos en 1993, en las secciones de Símbolos Misceláneos U + 2600-26FF o Dingbats U + 2700-27FF:



imagen




Estos glifos son como letras, en blanco y negro. Muchas fuentes tienen las suyas propias imagen(U + 2702 BLACK SCISSORS):



imagen




Apple Color Emoji tiene su propia versión:



imagen




¿Cómo sabe el sistema operativo qué mostrar imageno imagensi tienen el mismo código U + 2702?



Conoce U + FE0F, también conocido como VARIATION SELECTOR-16. Esta es una sugerencia para que el renderizador de texto cambie a emoji.



imagen




Simple, elegante y sin necesidad de resaltar nuevos puntos de código. imagentienen el mismo significado , pero un estilo de imagen ligeramente diferente.



Clústeres de grafemas



Aquí nos enfrentamos a otro problema: nuestros emoji ahora no son un punto de código, sino dos. Esto significa que necesitamos una forma de definir los límites del símbolo.



Un grupo de grafemas nos ayudará. Un grupo de grafemas es una secuencia de puntos de código que se ve como un solo glifo legible por humanos.



Los grupos de grafemas se inventaron no solo para emojis, sino que también son aplicables a alfabetos regulares. imagenEs un solo grupo de grafemas, incluso si consta de dos puntos de código: U + 0055 MAYÚSCULAS U ​​seguido de U + 0308 DIAERESIS COMBINADA.



Los clústeres de grafemas presentan una gran complejidad para los programadores. No puedes simplemente hacer substring(0, 10)



para tomar los primeros 10 caracteres, puede dividir el emoji por la mitad.



El reverso de la línea debe hacerse inteligentemente. U + 263A U + FE0F tiene sentido, pero U + FE0F U + 263A no.



imagen




Finalmente, no puede simplemente llamar .length



a una cadena. Bueno, puedes, pero el resultado te sorprenderá. Si es un desarrollador, intente ejecutarlo imagenen la consola de su navegador.



Consejo del programador: si está trabajando con texto, obtenga una biblioteca centrada en grupos de grafemas. Para C, C ++ y JVM puede ser ICU , Swift hace todo bien de forma predeterminada, para otros, hágalo usted mismo.



imagen




Esta cosa tiene 65 de largo y no se puede dividir. Viva con eso ahora.



Modificador de tono de piel



La mayoría de los emojis humanos representan a una persona amarilla abstracta. Cuando se agregó el tono de piel en 2015, en lugar de agregar un nuevo punto de código para cada combinación de emoji y tono de piel, solo se agregaron cinco nuevos puntos de código: U + 1F3FB..U + 1F3FF



No deben usarse por sí mismos, sino que deben agregarse a emoji existente ... Juntos forman una ligadura: si imprimimos imagen(U + 1F44B SEÑAL DE MANO ONDULADA), y luego (U + 1F3FD MODIFICADOR DE TONO DE PIEL MEDIO), obtenemos que imagen



imagenno tiene su propio punto de código (esta es una secuencia de dos: U + 1F44B U + 1F3FD), pero tiene su propia apariencia y sensación únicas. En total, con la ayuda de cinco modificadores, ~ 280 emojis humanos se transformaron en 1680 variaciones. Aquí hay algunos bailarines:



imagen




Carpintero de ancho cero



Digamos que tu amiga te acaba de enviar una foto de una manzana que está cultivando en su jardín. Necesitas responder, ¿cómo? Puede enviar imagenMUJER EMOJI (U + 1F469) con la imagenalmohadilla de arroz SHEAF OF RICE (U + 1F33E) adjunta . Al final, funcionará imagen, pero si abofetea U + 200D entre ellos, entonces obtienes un granjero: imagen



U + 200D se llama Joiner de ancho cero, o ZWJ para abreviar. Funciona de forma similar a lo que vimos con el tono de piel, pero esta vez puedes combinar dos emojis autónomos en uno. No todas las combinaciones funcionan, pero muchas lo hacen, ¡a veces de formas sorprendentes!



Algunos ejemplos:



imagen




Una extraña inconsistencia que noté es que el color del cabello se realiza a través de ZWJ, mientras que el tono de piel es solo un modificador de emoji sin ZWJ. ¿Por qué? No tengo idea.



imagen




Desafortunadamente, algunos emojis no se implementan como combinaciones con ZWJ. Considero que esta es una oportunidad perdida:



imagen




¿Cómo imprimir ZWJ? De ninguna manera. Pero puedes copiarlo desde aquí: “”. Nota: Este es un carácter especial, así que espere que se comporte de manera extraña. No lo ve, pero es. ( nota por: en el artículo original hay, pero Habr no lo permite )



Otra gran área donde ZWJ está a caballo es la configuración de familias y relaciones. Aquí hay una breve historia para ilustrar:



imagen




Banderas



Las banderas de países son parte del estándar Unicode, pero por alguna razón no se implementan en Windows. Si está leyendo esto en un navegador de Windows, ¡lo siento!



Los indicadores no tienen puntos de código dedicados. En cambio, son ligaduras de dos letras.



imagen




Izquierda: Windows, derecha: Mac



Es cierto, no usan letras reales. En su lugar, se utiliza el alfabeto de “letra de símbolo de indicador regional” (U + 1F1E6..1F1FF). Estas letras no se utilizan para nada más que componer banderas.



¿Qué pasa si juntas dos letras al azar? No mucho: imagen(excepto que la edición de texto comienza a comportarse de manera extraña).



Si desea experimentar, no dude en copiar y combinar de este alfabeto: imagen



hay 258 combinaciones válidas de dos letras. ¿Puedes encontrarlos todos?



Un efecto secundario divertido de la ligadura de dos letras: imagen



Secuencias de etiquetas



Las ligaduras de dos letras son geniales, pero ¿no quieres ser más genial? ¿Qué tal las ligaduras de 32 letras? Aquí están las secuencias de etiquetas.



Una secuencia de etiquetas es una secuencia de emoji regular, seguida de otro tipo de letras latinas (U + E0020..E007E), que termina con U + E007F CANCEL TAG.



Actualmente solo se utilizan para estas tres banderas: Inglaterra, Escocia y Gales:



imagen




Teclas



No es muy emocionante, pero es necesario para completar: las secuencias de teclas utilizan otra convención.



Se ve así: tome un número * o #, conviértalo en un emoji con U + FE0F, envuélvalo en un cuadrado con U + 20E3 COMBINANDO TECLAS INCLUIDAS



imagen




Hay 12 de ellos:



imagen




Actualizaciones de Unicode



Unicode se actualiza todos los años y los emoji son una parte fundamental de cada lanzamiento. Por ejemplo, en Unicode 13 (marzo de 2020) se agregaron 55 nuevos emojis.



En el momento de escribir este artículo, ni el último Mac OS (11.2.3) ni iOS (14.4.1) admiten emoji de tipo Unicode 13: imagen



Esto es lo que veo en marzo de 2021: imagen



pero gracias a la magia de ZWJ, todavía puedo Comprender lo que sucede simplemente no es de la manera más óptima.



Conclusión



Para resumir, hay siete formas de codificar emoji:



  1. Punto de código único imagen
  2. Punto de código único + selector de variación-16 imagen
  3. Modificador de tono de piel imagen
  4. Secuenciación con un ensamblador de ancho cero imagen
  5. Banderas imagen
  6. Secuencia de etiquetas imagen
  7. Secuencia de teclas imagen


Los métodos del 1 al 4 se pueden combinar para crear una publicación bastante compleja:



imagen




Si es programador, recuerde utilizar siempre la biblioteca de ICU para:



  • extracción de subcadena
  • medidas de longitud de línea
  • cuerda inversa


La palabra clave de Google es "Grapheme Cluster". Esto se aplica a emojis, diacríticos occidentales, fuentes inducidas y coreanas, así que tenga cuidado.



imagen








imagen



Vacantes
, , , - .



, , , .



, , . , , , , , .



, , .







Sobre ITELMA
- automotive . 2500 , 650 .



, , . ( 30, ), -, -, - (DSP-) .



, . , , , . , automotive. , , .


Lista de publicaciones útiles sobre Habré



All Articles