El emoji, el utf8mb4 y 176 dibujos de 12×12 píxeles
El Día del Emoji es hoy porque el calendario de Apple marca el 17 de julio, que es cuando presentaron iCal en 2002. A partir de ahí: los 176 iconos que hoy están en el MoMA, por qué length devuelve 2 y por qué el utf8 de MySQL se quedaba en tres bytes.
Hoy es el Día Mundial del Emoji. Y la razón por la que es hoy y no cualquier otro día es tan tonta, tan absolutamente arbitraria, que merece un artículo entero.
Mira el emoji de calendario: 📅
En los dispositivos de Apple, ese calendario marca el 17 de julio. Siempre. Y no es una efeméride del calendario mundial: es el día en que Apple presentó iCal, en 2002.
En 2014, Jeremy Burge, fundador de Emojipedia, se fijó en ese detalle y lo propuso como Día Mundial del Emoji. La fecha acabó adoptándose internacionalmente.
Me encanta. Es tecnología en estado puro: una convención sin autoridad detrás que todo el mundo acaba adoptando porque nadie tenía una idea mejor.

Donde acabaron aquellos 176 dibujos de 12×12 píxeles. Foto: Intel Free Press, CC BY-SA 2.0; imagen recortada y disponible bajo la misma licencia.
Antes hubo 176 dibujos de 12×12
La historia de verdad empieza en 1999, en Japón.
Shigetaka Kurita trabajaba en NTT DoCoMo, en el equipo de i-mode, un servicio de internet móvil pionero. El contexto era de restricciones duras: mensajes muy breves, pantallas diminutas y la necesidad de meter información visual en muy poco espacio.
De ahí salieron 176 iconos de 12×12 píxeles. Ciento cuarenta y cuatro píxeles cada uno para representar un corazón, una cara triste, tiempo nublado o un teléfono. No era arte: era ingeniería de comunicación bajo restricciones brutales.
Ese conjunto original entró en 2016 en la colección del MoMA de Nueva York, que es la trayectoria profesional más improbable de la historia del diseño.
Y luego llegó Unicode, y con él los problemas de verdad
Aquí es donde el asunto se pone interesante para quien programa.
Un emoji no es una imagen: es texto. Pero decir que es «un carácter, igual que la letra a» se queda corto, y ahí empieza la mitad de los errores. Puede ser un único punto de código (😀), uno con modificador de tono de piel (👍🏽), un carácter base con selector de variación para que se dibuje como emoji y no como símbolo (❤️), o una secuencia entera cosida con un carácter invisible, el Zero Width Joiner. Todo ello está especificado en el informe técnico UTS #51 de Unicode.
De ahí salen los problemas de verdad:
Uno. En JavaScript, "😂".length devuelve 2. Hoy, no «durante años»: length no cuenta caracteres percibidos, cuenta unidades de código UTF-16, y ese emoji se codifica como un surrogate pair, herencia de cuando se creyó que 65.536 caracteres bastarían para toda la humanidad. Array.from("😂").length sí devuelve 1, porque itera puntos de código. Lo que no arregla es el caso siguiente.
Dos. La familia 👨👩👧👦 son cuatro emojis cosidos con tres Zero Width Joiner: siete puntos de código que la pantalla dibuja como un solo grafema, así que ahí Array.from() te dirá 7. Para contar lo que el usuario ve, la herramienta es Intl.Segmenter con granularidad de grafema.
Y cuidado con la conclusión fácil: cuánto ocupa esa familia en tu límite de campo depende de qué esté contando cada capa. Bytes en disco, caracteres en la validación del formulario, puntos de código en el lenguaje y otra cosa distinta en la base de datos. El formulario que acepta el texto y la columna que lo recorta son el mismo bug visto desde dos sitios.
Tres. El clásico español: durante años, meter un emoji en un MySQL configurado con utf8 provocaba un error o truncaba el texto. Aquel utf8 no era falso: era una implementación limitada a tres bytes por carácter —hoy MySQL la llama utf8mb3 y está obsoleta— que no llega a los puntos de código de cuatro bytes, que es donde viven los emojis. El juego completo es utf8mb4, y hay que ponerlo en la tabla, en la columna y en la conexión.
Cuatro. El emoji que tú envías y el que la otra persona ve no son el mismo dibujo. Unicode define el concepto; cada fabricante lo dibuja. Hubo un caso célebre con la 🔫, que Apple convirtió en pistola de agua verde en 2016 mientras el resto seguía mostrando un arma. Enviabas una cosa y llegaba otra. Con implicaciones que, en algún juzgado, dejaron de tener gracia.
Cinco. Y el que más me gusta: los emojis se pueden ordenar, porque todo punto de código tiene un valor numérico. Con la misma configuración el resultado debería ser estable, aunque depende de la collation, del motor y de la versión de Unicode, y para una persona no significa nada.
El emoji que ganó todo
En 2015, el Diccionario Oxford eligió como palabra del año a 😂. No una palabra: un emoji.
Hubo quien lo interpretó como el fin de la civilización. A mí me parece justo lo contrario. Los emojis no empobrecen la escritura: recuperan algo que la escritura nunca tuvo y el habla siempre tuvo, que es el tono. Llevamos cinco mil años escribiendo sin poder indicar si algo va en serio o en broma, y la solución que hemos encontrado es una carita amarilla.
Es el mismo problema al que respondían aquellos 144 píxeles de 1999.
El emoji en el trabajo, que es donde arde
Y ahora la parte polémica, porque este es un blog de oficio.
El emoji en el entorno profesional tiene reglas no escritas y muy reales:
- El 👍 a secas es ambiguo hasta el crimen. Para media oficina significa «recibido». Para la otra media, «no pienso discutir esto contigo». Su interpretación puede variar entre personas, equipos y generaciones, cosa que se comprueba enseguida preguntando en cualquier oficina.
- La 🙂 al final de una frase seca es la forma más elegante de amenaza que ha producido el ser humano. «Lo necesito para hoy 🙂».
- El ✅ en un hilo de incidencia debería ser obligatorio. Es la única forma barata de cerrar un asunto sin escribir «vale» y generar otra notificación.
- Y el 🔥 en una pull request no es una revisión de código.
En mis proyectos sí uso una convención: emojis como prefijo estable en los mensajes de commit o en los canales de alerta. Un 🚨 para caídas, un 🐛 para bugs, un 📦 para despliegues. El ojo localiza una forma de color mucho más rápido que una palabra, y cuando tienes doscientas líneas en un canal a las tres de la mañana esa milésima cuenta.
Con una condición no negociable: el emoji acompaña, nunca sustituye. Al lado va la palabra —🚨 CAÍDA, 🐛 bug—, porque el símbolo solo no lo lee bien un lector de pantalla, no se busca con un grep, se pierde en los registros que no van en UTF-8 y sale como un cuadrado en una consola vieja. Si tu clasificación se rompe cuando el emoji no se dibuja, no es una clasificación: es un adorno con responsabilidades.
Feliz 17 de julio
Así que hoy, mientras alguien te manda un 👍 que no sabes cómo interpretar, acuérdate de que estás usando un estándar internacional del mismo comité que gestiona el alfabeto cirílico, y de que aquello empezó con 176 dibujos de doce por doce píxeles.
Ingeniería de comunicación bajo restricciones. Kurita otra vez.
🎉
Preguntas frecuentes
¿Por qué el Día del Emoji es el 17 de julio?
Porque el emoji de calendario en los dispositivos de Apple muestra el 17 de julio, la fecha en que Apple presentó iCal en 2002. Jeremy Burge, fundador de Emojipedia, se fijó en ese detalle y lo propuso como Día Mundial del Emoji en 2014; la fecha acabó adoptándose internacionalmente.
¿Quién creó los primeros emojis?
Shigetaka Kurita, mientras trabajaba en el servicio i-mode de la operadora japonesa NTT DoCoMo. El conjunto de 176 iconos de 12x12 pixeles se lanzó en 1999, en un contexto de mensajes muy breves y pantallas diminutas en el que había que transmitir información visual con muy poco espacio disponible. El Museo de Arte Moderno de Nueva York incorporó ese conjunto original a su colección en 2016.
¿Un emoji es un carácter Unicode?
No siempre uno solo. Puede tratarse de un único punto de código, de un punto de código acompañado de un modificador de tono de piel, de un carácter base con un selector de variación que indica que debe dibujarse como emoji, o de una secuencia de varios caracteres unidos mediante el carácter invisible Zero Width Joiner. El informe técnico UTS #51 de Unicode recoge la especificación completa.
¿Por qué "😂".length devuelve 2 en JavaScript?
Porque la propiedad length cuenta unidades de código UTF-16, no caracteres percibidos, y ese emoji queda fuera del rango básico, de modo que se codifica mediante un par suplente de dos unidades. Sigue comportándose así hoy. Array.from() itera puntos de código y devuelve 1 en ese caso, pero no resuelve las secuencias unidas con Zero Width Joiner: para contar unidades visibles conviene usar Intl.Segmenter con granularidad de grafema.
¿Cuántos caracteres ocupa un emoji en una base de datos?
Depende de qué esté contando cada capa. Una familia como la formada por cuatro figuras unidas con Zero Width Joiner son siete puntos de código y un solo grafema en pantalla, pero el límite de un campo puede estar expresado en bytes, en caracteres o en puntos de código, y el formulario, el lenguaje y la base de datos pueden no contar lo mismo. Conviene comprobar en qué unidad está definido cada límite antes de fijar longitudes.
¿Por qué fallan los emojis en MySQL?
Porque el juego de caracteres que MySQL llamó utf8 es una implementación limitada a tres bytes por carácter, hoy renombrada utf8mb3 y considerada obsoleta. Cubre la mayor parte del texto habitual, pero no los puntos de código de cuatro bytes en los que están los emojis. El juego adecuado es utf8mb4, con su collation correspondiente, y debe aplicarse a la tabla, a la columna y a la conexión.
¿Se ve el mismo emoji en todos los dispositivos?
No. Unicode define el significado y el nombre del carácter, pero cada fabricante decide cómo dibujarlo, de modo que el mismo punto de código puede tener aspecto y matiz distintos según la plataforma. El caso más conocido es el de la pistola, que Apple sustituyó por una pistola de agua verde en 2016 mientras otras plataformas mantenían un arma real.
¿Es buena idea usar emojis en commits, alertas o registros?
Como refuerzo visual sí, porque el ojo localiza una forma de color antes que una palabra. Pero nunca como única señal: junto al emoji debe ir el texto equivalente. Un símbolo aislado no lo interpreta bien un lector de pantalla, no se localiza mediante búsquedas de texto, se pierde en registros que no usen UTF-8 y puede mostrarse como un cuadrado en terminales o herramientas antiguas.
El blog, día a día
¿Te ha resultado útil o quieres comentar algo?
Hablemos →