Todo lo que nunca quiso saber sobre la normalización Unicode
Normalización canónica
Unicode incluye múltiples formas de codificar algunos caracteres, especialmente los caracteres acentuados. La normalización canónica cambia los puntos de código en una forma de codificación canónica. Los puntos de código resultantes deben aparecer idénticos a los originales, salvo los errores en las fuentes o el motor de representación.
Cuándo usar
Debido a que los resultados parecen idénticos, siempre es seguro aplicar la normalización canónica a una cadena antes de almacenarla o mostrarla, siempre que pueda tolerar que el resultado no sea bit por bit idéntico a la entrada.
La normalización canónica viene en 2 formas: NFD y NFC. Los dos son equivalentes en el sentido de que uno puede convertir entre estas dos formas sin pérdida. Comparar dos cadenas bajo NFC siempre dará el mismo resultado que compararlas bajo NFD.
NFD
NFD tiene los personajes completamente expandidos. Esta es la forma de normalización más rápida de calcular, pero da como resultado más puntos de código (es decir, usa más espacio).
Si solo desea comparar dos cadenas que aún no están normalizadas, esta es la forma de normalización preferida a menos que sepa que necesita normalización de compatibilidad.
NFC
NFC recombina puntos de código cuando es posible después de ejecutar el algoritmo NFD. Esto lleva un poco más de tiempo, pero da como resultado cadenas más cortas.
Normalización de compatibilidad
Unicode también incluye muchos caracteres que realmente no pertenecen, pero se usaron en conjuntos de caracteres heredados. Unicode agregó estos para permitir que el texto en esos juegos de caracteres se procese como Unicode y luego se convierta de nuevo sin pérdida.
La normalización de compatibilidad los convierte en la secuencia correspondiente de caracteres "reales", y también realiza la normalización canónica. Los resultados de la normalización de compatibilidad pueden no parecer idénticos a los originales.
Los caracteres que incluyen información de formato se reemplazan por otros que no. Por ejemplo, el personaje ⁹
se convierte a 9
. Otros no implican diferencias de formato. Por ejemplo, el carácter del número romano Ⅸ
se convierte en las letras regulares IX
.
Obviamente, una vez que se ha realizado esta transformación, ya no es posible volver a convertir sin pérdidas al conjunto de caracteres original.
Cuándo usar
El Consorcio Unicode sugiere pensar en la normalización de compatibilidad como una ToUpperCase
transformación. Es algo que puede ser útil en algunas circunstancias, pero no solo debe aplicarlo de todas formas.
Un excelente caso de uso sería un motor de búsqueda, ya que probablemente desee una búsqueda 9
que coincida ⁹
.
Una cosa que probablemente no debería hacer es mostrar el resultado de aplicar la normalización de compatibilidad al usuario.
NFKC / NFKD
La forma de normalización de compatibilidad viene en dos formas NFKD y NFKC. Tienen la misma relación que entre NFD y C.
Cualquier cadena en NFKC es inherentemente también en NFC, y lo mismo para NFKD y NFD. Por lo tanto NFKD(x)=NFD(NFKC(x))
, y NFKC(x)=NFC(NFKD(x))
, etc.
Conclusión
En caso de duda, vaya con la normalización canónica. Elija NFC o NFD según la compensación de espacio / velocidad aplicable, o según lo que requiera algo con lo que está interactuando.