También disponible en: English · Português · Français · العربية
Normalizador Unicode
Las cuatro formas de normalización a la vez, con el detalle carácter a carácter de lo que cada una pliega, cambia o tira.
¿Qué es la normalización Unicode?
Unicode suele dar más de una manera de escribir lo mismo. La letra é puede ser un único punto de código, U+00E9, o puede ser la letra e seguida de un acento agudo de combinación. Las dos se ven igual y las dos son correctas, pero son secuencias de bytes distintas: una comparación ingenua dice que son cadenas diferentes, buscar una no encuentra la otra, y una base de datos con una restricción de unicidad acepta las dos tan contenta.
La normalización es el arreglo. Reescribe el texto en una de cuatro formas definidas para que todo lo que significa lo mismo acabe escrito igual. Las formas se llaman NFC, NFD, NFKC y NFKD, y elegir entre ellas es la parte que de verdad importa.
Los nombres codifican dos decisiones independientes. La C es de compuesta y la D de descompuesta: si la é acaba siendo un punto de código o dos. La K, que despista, es de compatibilidad, y ese es otro eje completamente distinto: controla si los caracteres que solo se parecen se funden entre sí. Equivocarse en lo primero no cuesta nada que un lector pueda ver. Equivocarse en lo segundo destruye información.
Cómo usarlo
- Pega cualquier texto en la caja. Las cuatro formas se calculan según escribes. Cada una viene etiquetada como canónica o de compatibilidad, y marcada cuando difiere de lo que has escrito.
- Compara los tres recuentos de debajo de cada forma. Las unidades UTF-16 son lo que informa la longitud de una cadena, los puntos de código son lo que cuenta Unicode y los caracteres son lo que cuenta un lector. La misma palabra puede dar tres respuestas distintas, y NFC y NFD discrepan en las dos primeras aunque signifiquen el mismo texto.
- Mira qué le hace el truco para quitar acentos. El panel de abajo ejecuta la receta habitual y enseña, carácter a carácter, qué letras se plegaron a ASCII, cuáles se dejaron en paz y cuáles desaparecieron del todo.
Lo canónico es seguro, lo de compatibilidad no
NFC y NFD son formas canónicas. Reordenan sin cambiar el significado: la é como un punto de código y la é como dos son genuinamente el mismo carácter, y pasar de una a otra es reversible en el sentido que importa, porque NFC aplicado a la forma descompuesta devuelve exactamente la compuesta. Aplicar cualquiera de las dos a un texto arbitrario es seguro, y NFC es la que quieres casi siempre, porque es lo que esperan la web, los nombres de fichero y la mayoría de bases de datos.
NFKC y NFKD son formas de compatibilidad, y son otro tipo de operación con un nombre parecido. Funden caracteres con otros a los que solo se asemejan. El dos volado de m² pasa a ser un 2 normal, así que un metro cuadrado se convierte en m2. La ligadura fi pasa a dos letras. El numeral romano Ⅳ pasa a las letras I y V. El símbolo de marca registrada pasa a TM. La fracción ½ pasa a 1⁄2. Los números en círculo pasan a dígitos normales, y las letras latinas de ancho completo a letras corrientes.
Nada de eso es un fallo: es justamente el propósito. El plegado de compatibilidad existe para que buscar m2 encuentre m², y para que no se puedan falsificar identificadores con caracteres parecidos. Pero es de ida y no de vuelta. Una vez que has plegado un volado en un dígito ya no puedes saber si el original era m² o m2, y si esa distinción llevaba significado, se ha perdido. Usa las formas de compatibilidad para claves de comparación e índices de búsqueda; no guardes su salida como si fuera el texto del usuario.
La medición que hay detrás merece decirse tal cual. Sobre los 288.767 puntos de código asignados, NFC cambia 1.120, NFD cambia 13.233, NFKC cambia 4.928 y NFKD cambia 17.029. Cada par de formas discrepa con cualquier otro en algún sitio: NFC frente a NFKD en 15.930 puntos de código ellos solos. Un único carácter también puede crecer de forma espectacular: U+FDFA, una ligadura árabe, se expande a dieciocho caracteres bajo NFKD.
El truco para quitar acentos borra letras de verdad
Busca cómo quitar los acentos de una cadena y encontrarás la misma receta de tres pasos en todas partes: normalizar a NFD, quitar las marcas de combinación y quedarse solo con ASCII. Funciona de maravilla con el ejemplo que todo el mundo prueba. café pasa a cafe, naïve pasa a naive, y el truco se copia a otro proyecto.
Conviene ser preciso sobre dónde se tuerce, porque la versión habitual lo cuenta al revés. El paso de normalizar no borra nada en absoluto: medido sobre todas las letras latinas, quitar las marcas de combinación después de NFD elimina exactamente cero. El daño lo hace el filtro ASCII de después. Una letra como ß, ø, ł, đ, ħ, þ o æ no tiene ningún acento que quitar de entrada; sobrevive intacta a la normalización y luego se tira por el delito de no estar entre la a y la z.
Barrido sobre las 907 letras latinas de Unicode, NFD seguido de ese filtro pliega 540 a ASCII y borra 367 del todo. Cambiar a NFKD lo mejora solo un poco: 578 plegadas, 329 borradas, rescatando 38 letras que NFD pierde porque tienen descomposición de compatibilidad donde no tienen canónica.
En palabras normales el resultado no es sutil. Straße pasa a Strae, que no es Strasse, la transliteración alemana correcta, sino una palabra a la que sencillamente le falta una letra. Łódź pasa a odz. Đà Nẵng pasa a aNang. Y Ærø, una isla danesa, pasa a la única letra r, porque dos de sus tres letras se borran y la superviviente es una r ASCII que nunca se tocó. Si necesitas plegar texto a ASCII, lo que necesitas es una tabla de transliteración, no una forma de normalización.
Límites honestos
Las cuatro formas las calcula la implementación del estándar de tu propio navegador, que es la misma que usará tu código. Esta página no implementa la normalización; te enseña lo que hace la plataforma y cuenta las consecuencias.
La demostración del truco de los acentos reproduce el fragmento popular a propósito, incluidos sus rangos de marcas de combinación. Está para enseñar qué hace esa receta concreta, no para ser el mejor plegador a ASCII posible: una herramienta que usara en silencio un algoritmo mejor estaría discutiendo con algo que nadie escribió.
La normalización no es plegado de mayúsculas y minúsculas, y por sí sola no es una frontera de seguridad. NFKC se usa como parte de la comparación de identificadores en varios estándares, pero plegar por sí solo no hace que dos identificadores puedan tratarse como iguales sin riesgo; los caracteres confundibles entre alfabetos son otro problema con sus propios datos de Unicode, y esta página no lo aborda.
Por último, las cifras citadas arriba están atadas a una versión de Unicode. Se midieron contra la versión que trae la biblioteca estándar de Python, contrastadas con la implementación de tu navegador, y el script que las produjo está guardado junto al sitio para que los números se puedan regenerar en vez de creerse.
¿Por qué es gratis?
Porque no cuesta nada mantenerlo. Cada forma se calcula en tu navegador según escribes; no se sube nada, no se registra nada y ningún servidor ve tu texto.
Ni cuenta, ni registro, ni nada reservado. El comportamiento sale del anexo de Unicode que tu navegador ya implementa, y las mediciones de esta página se contrastan con una implementación distinta en Python, así que los números son una comparación y no una afirmación.