Unicode 18.0: 13.000 Caracteres Nuevos Que Ya Están Llegando a Tu Navegador
El estándar Unicode publicó su versión 18 el 16 de septiembre: nuevos scripts, tres símbolos de moneda y otro recordatorio anual de que .length no cuenta caracteres.
Cita anual con el caos: Unicode 18
El 16 de septiembre se publicó Unicode 18.0: unos 13.000 caracteres nuevos que llevan el total por encima de los 172.000, incluyendo tres símbolos de moneda nuevos, varios scripts adicionales y la consiguiente actualización de datos de ordenación en CLDR e ICU.
Hace poco más de un año te explicábamos cómo Unicode 16 rompía normalizadores y comparaciones. El patrón se repite, así que en lugar de repetir la teoría vamos a lo práctico: qué revisar esta vez.
Lo que realmente te puede romper
1. Contadores de caracteres
Nada nuevo bajo el sol: .length sigue contando unidades UTF-16, no caracteres ni grafemas. Cada emoji nuevo es un surrogate pair más que tu validador de "máximo 50 caracteres" cuenta como 2 — o más si lleva modificadores de tono o ZWJ sequences.
''.length; // 2 — unidades UTF-16
[...''].length; // 1 — code points
new Intl.Segmenter().segment('').containing(0);
// el grapheme cluster real
Si cuentas caracteres "de verdad", Intl.Segmenter es la única respuesta correcta desde hace años.
2. Ordenaciones
'ä'.localeCompare('z') depende de los datos de collation de CLDR/ICU que tenga el runtime del usuario. Unicode 18 actualiza esas tablas vía CLDR 48.x e ICU 78.x: entre un Chrome actualizado y uno que no, dos clientes pueden ordenar la misma lista de forma distinta durante meses.
Si el orden importa —leaderboards, exports deterministas, diffs— fija collation con new Intl.Collator(locale) o hazlo server-side.
3. Regex y clases de caracteres
Con el flag u, p{L} (cualquier letra) depende de la versión de Unicode del engine: los caracteres nuevos de la 18 simplemente no matchean en un runtime con datos antiguos. Validar nombres de usuario, slugs o tokens con p{} significa aceptar que "válido" depende del navegador.
4. Dedupe y normalización
Los caracteres nuevos traen nuevas equivalencias de normalización NFC/NFKC. Si tu lógica de deduplicación normaliza antes de comparar —como hace nuestro eliminador de duplicados— recuerda que dos strings que parecen iguales pueden diferir a nivel de code point según el runtime.
El desfase de siempre
Unicode release ≠ soporte inmediato. El consorcio publica el estándar; los engines lo absorben meses después vía ICU. Mientras tanto conviven navegadores que ven el emoji nuevo y navegadores que ven cuadrados — igual que pasó con Unicode 16, 17 y todas las anteriores.
Recomendación práctica:
- Define qué versión de Unicode aceptas en validaciones de contenido de usuario, y documéntalo.
- Usa
p{}con flagu, nunca rangos manuales tipo[a-zA-Záéíóúñ]que se quedan obsoletos con cada release. - Para ordenar,
Intl.Collatorexplícito o sorting en servidor: pruébalo en nuestro ordenador de texto si quieres ver cómo se comportalocaleComparecon tus datos reales. - Para mayúsculas/minúsculas, recuerda que el case folding de Unicode es más rico que
toUpperCase()a secas — algo que puedes comprobar en nuestro conversor de mayúsculas.
Unicode 18 no va a romper tu app mañana. Pero la acumulación de "versiones de Unicode distintas por cliente" es exactamente el tipo de bug que aparece en producción un martes y nadie sabe reproducir.
Artigos relacionados
El Gusano Shai-Hulud Sigue Vivo en npm: Qué Credenciales Rotar y en Qué Orden
tensorlake@0.5.144 es la última variante del gusano que roba tokens de npm, GitHub y tu .env antes de republicarse con tu identidad. Checklist práctico si instalaste paquetes afectados.
OAuth 2.1 Ya Jubila Oficialmente a RFC 6749: Estas Son las Reglas Nuevas
El draft-16 de OAuth 2.1, publicado en septiembre, declara obsoletos RFC 6749 y 6750: PKCE para todos, adiós al implicit grant. Y el nuevo BCP de validación de JWT está a punto de ser RFC.
Temporal Ya Es Estándar: La API Que Por Fin Sustituye a Date
TC39 aprobó Temporal en Stage 4 y ya funciona sin flags en Chrome, Firefox y Node 26. Qué cambia para tus timestamps, zonas horarias y cálculos de fechas.