La equivalencia Unicode es la especificación del estándar de codificación de caracteres Unicode que establece que algunas secuencias de puntos de código representan esencialmente el mismo carácter. Esta característica se introdujo en el estándar para permitir la compatibilidad con conjuntos de caracteres estándar preexistentes , que a menudo incluían caracteres similares o idénticos.
Unicode proporciona dos de estas nociones: equivalencia canónica y compatibilidad. Se asume que las secuencias de puntos de código definidas como canónicamente equivalentes tienen la misma apariencia y significado cuando se imprimen o muestran. Por ejemplo, el punto de código U+006E n LETRA MINÚSCULA LATINA N seguido de U+0303 ◌ ̃ TILDE COMBINADA está definido por Unicode como canónicamente equivalente al punto de código único U+00F1 ñ LETRA MINÚSCULA LATINA N CON TILDE . Por lo tanto, esas secuencias deben mostrarse de la misma manera, deben ser tratadas de la misma forma por aplicaciones como la ordenación alfabética de nombres o la búsqueda , y pueden sustituirse entre sí. De manera similar, cada bloque de sílabas Hangul que se codifica como un solo carácter puede codificarse de forma equivalente como una combinación de un jamo de unión inicial; un jamo de unión vocálico; y, si corresponde, un jamo de unión final.
Se asume que las secuencias definidas como compatibles pueden tener apariencias distintas, pero el mismo significado en algunos contextos. Así, por ejemplo, U+FB00 ff LATIN SMALL LIGATURE FF , una ligadura tipográfica , se define como compatible con, pero no canónicamente equivalente a, la secuencia U+0066 U+0066 (dos letras latinas "f"). Las secuencias compatibles pueden tratarse de la misma manera en algunas aplicaciones (como la clasificación y la indexación ), pero no en otras, y pueden sustituirse entre sí en algunas situaciones, pero no en otras. Las secuencias que son canónicamente equivalentes también son compatibles, pero lo contrario no es necesariamente cierto.
El estándar también define un procedimiento de normalización de texto , llamado normalización Unicode , que reemplaza secuencias de caracteres equivalentes de manera que dos textos cualesquiera que sean equivalentes se reduzcan a la misma secuencia de puntos de código, denominada forma normalizada o forma normal del texto original. Para ambas nociones de equivalencia, Unicode define dos formas normales: una totalmente compuesta (donde los puntos de código múltiples se reemplazan por puntos únicos siempre que sea posible) y una totalmente descompuesta (donde los puntos únicos se dividen en varios).
Fuentes de equivalencia
Duplicación de caracteres
Por motivos de compatibilidad u otras razones, Unicode a veces asigna dos puntos de código diferentes a entidades que son esencialmente el mismo carácter. Por ejemplo, la letra "A con diacrítico de anillo encima" se codifica como U+00C5 Å LETRA MAYÚSCULA LATINA A CON ANILLO ENCIMA (una letra del alfabeto en sueco y otros idiomas ) o como U+212B Å SIGNO DE ANGSTROM . Sin embargo, el símbolo de angstrom se define como esa letra sueca, y la mayoría de los demás símbolos que son letras (como ⟨ V ⟩ para voltio ) no tienen un punto de código separado para cada uso. En general, los puntos de código de caracteres verdaderamente idénticos se definen como canónicamente equivalentes.
Combinación de caracteres precompuestos
Para mantener la coherencia con algunos estándares más antiguos, Unicode proporciona puntos de código únicos para muchos caracteres que podrían considerarse formas modificadas de otros caracteres (como U+00F1 para "ñ" o U+00C5 para "Å") o como combinaciones de dos o más caracteres (como U+FB00 para la ligadura ff o U+0132 para la letra holandesa ij ).
Para mayor coherencia con otros estándares y una mayor flexibilidad, Unicode también proporciona códigos para muchos elementos que no se utilizan por sí solos, sino que están destinados a modificar o combinarse con un carácter base precedente . Ejemplos de esos caracteres combinables son U+0303 ◌ ̃ COMBINACIÓN DE TILDE y el diacrítico japonés dakuten ( U+3099 ◌゙COMBINACIÓN DE MARCA DE SONIDO CON VOZ KATAKANA-HIRAGANA ).
En el contexto de Unicode, la composición de caracteres es el proceso de reemplazar los puntos de código de una letra base seguidos de uno o más caracteres combinatorios en un único carácter precompuesto ; y la descomposición de caracteres es el proceso opuesto.
En general, los caracteres precompuestos se definen como canónicamente equivalentes a la secuencia de su letra base y los signos diacríticos combinatorios subsiguientes, cualquiera que sea el orden en que aparezcan.
Ejemplo
No interacción tipográfica
Algunos sistemas de escritura utilizan habitualmente múltiples marcas combinatorias que, por lo general, no interactúan tipográficamente y carecen de caracteres precompuestos para dichas combinaciones. Los pares de estas marcas no interactivas pueden almacenarse en cualquier orden. Generalmente, las secuencias alternativas son canónicamente equivalentes. Las reglas que definen su secuenciación en la forma canónica también definen si se consideran interactivas.
Convenciones tipográficas
Unicode proporciona puntos de código para algunos caracteres o grupos de caracteres que se modifican únicamente por razones estéticas (como ligaduras , caracteres katakana de ancho reducido o letras latinas de ancho completo para su uso en textos japoneses) o para añadir nueva semántica sin perder la original (como dígitos en subíndice o superíndice , o dígitos rodeados con un círculo (como "①") heredados de algunas fuentes japonesas). Dicha secuencia se considera compatible con la secuencia de caracteres originales (individuales y sin modificar) para beneficio de aplicaciones donde la apariencia y la semántica añadida no son relevantes. Sin embargo, las dos secuencias no se declaran canónicamente equivalentes, ya que la distinción tiene cierto valor semántico y afecta a la representación del texto.
Errores de codificación
Las codificaciones UTF-8 y UTF-16 (y también otras codificaciones Unicode) no admiten todas las secuencias posibles de unidades de código . Los distintos programas convierten las secuencias no válidas en caracteres Unicode mediante reglas variables, algunas de las cuales implican una gran pérdida de información (como convertir todas las secuencias no válidas en el mismo carácter). Esto puede considerarse una forma de normalización y puede generar las mismas dificultades que otros métodos.
Normalización
Un software de procesamiento de texto que implemente la función de búsqueda y comparación de cadenas Unicode debe tener en cuenta la presencia de puntos de código equivalentes. Sin esta función, los usuarios que busquen una secuencia de puntos de código específica no podrían encontrar otros glifos visualmente indistinguibles que tengan una representación de puntos de código diferente pero canónicamente equivalente.
Algoritmos
Unicode proporciona algoritmos de normalización estándar que generan una secuencia de puntos de código única (normal) para todas las secuencias equivalentes; el criterio de equivalencia puede ser canónico (NF) o de compatibilidad (NFK). Dado que se puede elegir arbitrariamente el elemento representativo de una clase de equivalencia , existen múltiples formas canónicas posibles para cada criterio de equivalencia. Unicode proporciona dos formas normales semánticamente significativas para cada uno de los dos criterios de compatibilidad: las formas compuestas NFC y NFKC, y las formas descompuestas NFD y NFKD. Tanto las formas compuestas como las descompuestas imponen un orden canónico a la secuencia de puntos de código, lo cual es necesario para que las formas normales sean únicas.
Para comparar o buscar cadenas Unicode, el software puede usar formas compuestas o descompuestas; la elección no importa siempre que sea la misma para todas las cadenas involucradas en una búsqueda, comparación, etc. Por otro lado, la elección de los criterios de equivalencia puede afectar los resultados de la búsqueda. Por ejemplo, algunas ligaduras tipográficas como U+FB03 ( ffi ), números romanos como U+2168 ( Ⅸ ) e incluso subíndices y superíndices , p. ej. U+2075 ( ⁵ ) tienen sus propios puntos de código Unicode. La normalización canónica (NF) no afecta a ninguno de ellos, pero la normalización de compatibilidad (NFK) descompone la ligadura ffi en las letras constituyentes y, por lo tanto, una búsqueda de U+0066 ( f ) como subcadena tendría éxito en una normalización NFKC de U+FB03 pero no en una normalización NFC de U+FB03. Lo mismo ocurre al buscar la letra latina I (U+0049) en el número romano precompuesto Ⅸ (U+2168). De manera similar, el superíndice ⁵ (U+2075) se transforma en 5 (U+0035) mediante una correspondencia de compatibilidad.
Sin embargo, transformar los superíndices en sus equivalentes de línea base puede no ser apropiado para el software de texto enriquecido, ya que la información del superíndice se pierde en el proceso. Para permitir esta distinción, la base de datos de caracteres Unicode contiene etiquetas de formato de compatibilidad que proporcionan detalles adicionales sobre la transformación de compatibilidad. [ 1 ] En el caso de las ligaduras tipográficas, esta etiqueta es simplemente <compat>, mientras que para el superíndice es <super>. Los estándares de texto enriquecido como HTML tienen en cuenta las etiquetas de compatibilidad. Por ejemplo, HTML utiliza su propio marcado para posicionar un U+0035 en una posición de superíndice. [ 2 ]
Formas normales
Las cuatro formas de normalización Unicode y los algoritmos (transformaciones) para obtenerlas se enumeran en la tabla siguiente.
Todos esos algoritmos son transformaciones idempotentes , lo que significa que una cadena que ya se encuentra en una de esas formas normalizadas no se modificará si se procesa de nuevo con el mismo algoritmo.
Las formas normales no son cerradas bajo la concatenación de cadenas . [ 3 ] Para cadenas Unicode defectuosas que comienzan con una vocal Hangul o con jamo de unión final , la concatenación puede romper la composición.
Sin embargo, no son inyectivas (asignan diferentes glifos y secuencias originales a la misma secuencia normalizada) y, por lo tanto, tampoco biyectivas (no se pueden restaurar). Por ejemplo, las distintas cadenas Unicode "U+212B" (el signo de angstrom "Å") y "U+00C5" (la letra sueca "Å") se expanden mediante NFD (o NFKD) en la secuencia "U+0041 U+030A" (letra latina "A" y anillo combinado encima de "°"), que luego se reduce mediante NFC (o NFKC) a "U+00C5" (la letra sueca "Å").
Un solo carácter (que no sea un bloque de sílabas Hangul) que se reemplaza por otro durante la normalización puede identificarse en las tablas Unicode por tener un campo de compatibilidad no vacío pero carecer de una etiqueta de compatibilidad.
Ordenación canónica
El ordenamiento canónico se refiere principalmente al ordenamiento de una secuencia de caracteres combinatorios. En los ejemplos de esta sección, se asume que los caracteres son diacríticos , pero, en general, algunos diacríticos no son caracteres combinatorios y algunos caracteres combinatorios no son diacríticos.
Unicode asigna a cada carácter una clase de combinación , identificada por un valor numérico. Los caracteres que no se combinan tienen el número de clase 0, mientras que los que sí se combinan tienen un valor positivo. Para obtener el orden canónico, cada subcadena de caracteres con un valor de clase de combinación distinto de cero debe ordenarse según dicho valor mediante un algoritmo de ordenación estable . Este ordenamiento estable es necesario porque se supone que los caracteres que se combinan con el mismo valor de clase interactúan tipográficamente, por lo que los dos posibles órdenes no se consideran equivalentes.
Por ejemplo, el carácter U+1EBF (ế), utilizado en el alfabeto vietnamita , tiene acento agudo y acento circunflejo. Su descomposición canónica es la secuencia de tres caracteres U+0065 (e) U+0302 (acento circunflejo) U+0301 (acento agudo). Las clases combinatorias para ambos acentos son 230, por lo que U+1EBF no es equivalente a U+0065 U+0301 U+0302.
Dado que no todas las secuencias combinables tienen un equivalente precompuesto (la última del ejemplo anterior solo se puede reducir a U+00E9 U+0302), incluso la forma normal de NFC se ve afectada por el comportamiento de los caracteres combinables.
Errores debidos a diferencias de normalización
Cuando dos aplicaciones comparten datos Unicode pero los normalizan de forma diferente, pueden producirse errores y pérdida de datos. En un caso concreto, OS X normalizó los nombres de archivo Unicode enviados desde el software de intercambio de archivos e impresoras Netatalk y Samba . Netatalk y Samba no reconocieron los nombres de archivo modificados como equivalentes a los originales, lo que provocó la pérdida de datos. [ 4 ] [ 5 ] Resolver este problema no es sencillo, ya que la normalización no es reversible sin pérdida de información.
Véase también
- Diseño de texto complejo : posicionamiento de grafemas dependiente del vecino
- Diacrítico : signo modificador añadido a una letra.
- Ataque de homógrafos IDN : letras visualmente similares en nombres de dominio.
- ISO/IEC 14651 – Estándar de algoritmo de comparación de cadenas
- Ligadura (tipografía) – Glifo que combina dos o más formas de letras Páginas que muestran descripciones breves de destinos de redirección
- Carácter precompuesto : carácter compuesto con un único punto de código.
- Glifo representativo : arquetipo no específico para representar un grafema.
- uconv – Software de utilidad de conversión , que puede convertir desde y hacia formatos de normalización Unicode NFC y NFD.
- Unicode : estándar de codificación de caracteres
- Caracteres de compatibilidad Unicode : caracteres codificados únicamente para mantener la convertibilidad bidireccional con otros estándares.
Notas
- ↑ "UAX #44: Base de datos de caracteres Unicode" . Unicode.org . Consultado el 20 de noviembre de 2014 .
- ↑ "Unicode en XML y otros lenguajes de marcado" . Unicode.org . Consultado el 20 de noviembre de 2014 .
- ↑ Por ¿ Qué se debe hacer con la concatenación?
- ↑ "netatalk / Bugs / #349 volcharset:UTF8 no funciona desde Mac" . SourceForge . Consultado el 20 de noviembre de 2014 .
- ↑ "¡rsync, samba, UTF8, caracteres internacionales, ¡madre mía!" . 2009. Archivado del original el 9 de enero de 2010.
Referencias
- Anexo n.º 15 del estándar Unicode: Formularios de normalización Unicode
Enlaces externos
- Preguntas frecuentes de Unicode.org - Normalización
- Charlint: una herramienta de normalización de caracteres escrita en Perl.
- algoritmos Unicode