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 " 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: así como a mostrar «GHz» como un único glifo: .
Dirigida a la flecha de dos puntas derecha con las plumas y dos líneas verticales: o Semiglazov Monster: . Y el pato:
Preste atención al bloque con jeroglíficos egipcios (U + 13000 - U + 1342F), hay muchas cosas interesantes:
Emoji básico
Los emoji son solo caracteres Unicode, que se encuentran aquí U + 1F300-1F6FF y aquí U + 1F900-1FAFF:
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 computadora 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.
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.
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?
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: .
Cualquiera que sea la fuente que uses, los emojis tienen el mismo aspecto.
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:
Estos glifos son como letras, en blanco y negro. Muchas fuentes tienen las suyas propias (U + 2702 BLACK SCISSORS):
Apple Color Emoji tiene su propia versión:
¿Cómo sabe el sistema operativo qué mostrar o si 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.
Simple, elegante y sin necesidad de resaltar nuevos puntos de código. tienen 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. Es 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.
Finalmente, no puede simplemente llamar
.length
a una cadena. Bueno, puedes, pero el resultado te sorprenderá. Si es un desarrollador, intente ejecutarlo en 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.
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 (U + 1F44B SEÑAL DE MANO ONDULADA), y luego (U + 1F3FD MODIFICADOR DE TONO DE PIEL MEDIO), obtenemos que
no 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:
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 MUJER EMOJI (U + 1F469) con la almohadilla de arroz SHEAF OF RICE (U + 1F33E) adjunta . Al final, funcionará , pero si abofetea U + 200D entre ellos, entonces obtienes un granjero:
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:
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.
Desafortunadamente, algunos emojis no se implementan como combinaciones con ZWJ. Considero que esta es una oportunidad perdida:
¿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:
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.
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: (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:
hay 258 combinaciones válidas de dos letras. ¿Puedes encontrarlos todos?
Un efecto secundario divertido de la ligadura de dos letras:
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:
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
Hay 12 de ellos:
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:
Esto es lo que veo en marzo de 2021:
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:
- Punto de código único
- Punto de código único + selector de variación-16
- Modificador de tono de piel
- Secuenciación con un ensamblador de ancho cero
- Banderas
- Secuencia de etiquetas
- Secuencia de teclas
Los métodos del 1 al 4 se pueden combinar para crear una publicación bastante compleja:
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.
- El primer sistema de control en serie de Rusia para un motor de combustible dual con separación funcional de controladores
- Hay más líneas de código en un automóvil moderno que ...
- Cursos en línea gratuitos en automoción, aeroespacial, robótica e ingeniería (50+)
- McKinsey: repensar el software y la arquitectura de la electrónica en la automoción
Sobre ITELMA
Lista de publicaciones útiles sobre Habré