Intentar comprender las sutilezas del Unicode moderno me está haciendo doler la cabeza. En particular, la distinción entre puntos de código, caracteres, glifos y grafemas, conceptos que en el caso más simple , cuando se trata de texto en inglés con caracteres ASCII, todos tienen una relación uno a uno entre sí, me está causando problemas.
Al ver cómo estos términos se utilizan en documentos como el JavaScript de Matthias Bynens tiene un problema Unicode o el artículo de Wikipedia sobre la unificación Han , he deducido que estos conceptos no son lo mismo y que es peligroso combinarlos, pero estoy un poco luchando por comprender lo que significa cada término .
El Consorcio Unicode ofrece un glosario para explicar estas cosas, pero está lleno de "definiciones" como esta:
Carácter abstracto . Una unidad de información utilizada para la organización, control o representación de datos textuales. ...
...
Personaje . ... (2) Sinónimo de carácter abstracto. (3) La unidad básica de codificación para la codificación de caracteres Unicode. ...
...
Glifo . (1) Una forma abstracta que representa una o más imágenes de glifos. (2) Un sinónimo de imagen de glifo. Al mostrar datos de caracteres Unicode, se pueden seleccionar uno o más glifos para representar un carácter particular.
...
Grafema . (1) Una unidad de escritura mínimamente distintiva en el contexto de un sistema de escritura particular. ...
La mayoría de estas definiciones poseen la calidad de sonar muy académicas y formales, pero carecen de la calidad de significado , o bien difieren el problema de la definición a otra entrada o sección del glosario de la norma.
Así que busco la sabiduría arcana de aquellos más eruditos que yo. ¿En qué se diferencian exactamente cada uno de estos conceptos y en qué circunstancias no tendrían una relación uno a uno?
fuente
Respuestas:
Carácter es un término sobrecargado que puede significar muchas cosas.
Un punto de código es la unidad atómica de información. El texto es una secuencia de puntos de código. Cada punto de código es un número que recibe el significado del estándar Unicode.
Una unidad de código es la unidad de almacenamiento de una parte de un punto de código codificado. En UTF-8 esto significa 8 bits, en UTF-16 esto significa 16 bits. Una sola unidad de código puede representar un punto de código completo o parte de un punto de código. Por ejemplo, el glifo de muñeco de nieve (
☃
) es un único punto de código pero 3 unidades de código UTF-8 y 1 unidad de código UTF-16.Un grafema es una secuencia de uno o más puntos de código que se muestran como una única unidad gráfica que un lector reconoce como un elemento único del sistema de escritura. Por ejemplo, ambos
a
yä
son grafemas, pero pueden consistir en múltiples puntos de código (por ejemplo,ä
pueden ser dos puntos de código, uno para el carácter basea
seguido de uno para la diéresis; pero también hay un punto de código alternativo, heredado y único que representa este grafema ) Algunos puntos de código nunca forman parte de ningún grafema (p. Ej., La anulación de ancho cero o las anulaciones direccionales).Un glifo es una imagen, generalmente almacenada en una fuente (que es una colección de glifos), utilizada para representar grafemas o partes de los mismos. Las fuentes pueden componer múltiples glifos en una sola representación, por ejemplo, si lo anterior
ä
es un único punto de código, una fuente puede elegir representarlo como dos glifos separados, superpuestos espacialmente. Para OTF, las tablas GSUB y GPOS de la fuente contienen información de sustitución y posicionamiento para que esto funcione. Una fuente también puede contener múltiples glifos alternativos para el mismo grafema.fuente
.length
,.codePointAt(0)
,.codePointAt(1)
,.charCodeAt(0)
y.charCodeAt(1)
los resultados?a
más "combinación de signos diacríticos"); en la canonicalización compuesta está representada por un único punto de código (ä
del antiguo rango latino-1 heredado). La canonicalización Unicode es el tema que desea investigar si esto le interesa. En un mundo de pizarra en blanco, solo habría personajes básicos y combinados, y no compuestos precompilados.Fuera del estándar Unicode, un carácter es una unidad individual de texto compuesta de uno o más grafemas . Lo que el estándar Unicode define como "personajes" es en realidad una mezcla de grafemas y personajes. Unicode proporciona reglas para la interpretación de grafemas yuxtapuestos como caracteres individuales.
Un punto de código Unicode es un número único asignado a cada carácter Unicode (que es un carácter o un grafema).
Desafortunadamente, las reglas Unicode permiten que algunos grafemas yuxtapuestos se interpreten como otros grafemas que ya tienen sus propios puntos de código ( formas precompuestas ). Esto significa que hay más de una forma en Unicode para representar un personaje. La normalización Unicode soluciona este problema.
Un glifo es la representación visual de un personaje. Una fuente proporciona un conjunto de glifos para un determinado conjunto de caracteres (no caracteres Unicode). Para cada personaje, hay un número infinito de glifos posibles.
Una respuesta a Mark Amery
Primero, como dije, hay un número infinito de glifos posibles para cada carácter, así que no, un carácter no está "siempre representado por un solo glifo". Unicode no se preocupa mucho por los glifos, y las cosas que define en sus tablas de códigos ciertamente no son glifos. El problema es que tampoco son todos personajes. Entonces, ¿qué son?
¿Cuál es la entidad mayor, el grafema o el personaje? ¿Cómo se llaman esos elementos gráficos en el texto que no son letras o signos de puntuación? Un término que viene rápidamente a la mente es "grafema". Es una palabra que evoca precisamente la idea de "una unidad gráfica en un texto". Ofrezco esta definición: un grafema es el componente distinto más pequeño en un texto escrito .
Uno podría ir al otro lado y decir que los grafemas están compuestos de caracteres, pero luego se llamarían "grafemas chinos", y todos esos pedazos y piezas de los que se componen los grafemas chinos deberían llamarse "caracteres". Sin embargo, eso es todo al revés. Los grafemas son pequeños pedazos distintos. Los personajes están más desarrollados. La frase "los glifos son componibles", se indicaría mejor en el contexto de Unicode como "los caracteres son componibles".
Unicode define caracteres, pero también define grafemas que se deben componer con otros grafemas o caracteres. Esas monstruosidades que compusiste son un buen ejemplo de esto. Si se dan cuenta, tal vez obtendrán sus propios puntos de código en una versión posterior de Unicode;)
Hay un elemento recursivo en todo esto. En los niveles superiores, los grafemas se convierten en personajes en grafemas, pero son grafemas hasta el final.
Una respuesta a TS
El capítulo 1 de los estados estándar: "La codificación de caracteres Unicode trata los caracteres alfabéticos, los caracteres ideográficos y los símbolos de manera equivalente, lo que significa que pueden usarse en cualquier mezcla y con la misma facilidad". Dada esta declaración, debemos estar preparados para una combinación de términos en el estándar. A veces, la terminología adecuada solo se vuelve clara en retrospectiva a medida que se desarrolla un estándar.
A menudo sucede en las definiciones formales de un lenguaje que dos cosas fundamentales se definen en términos el uno del otro. Por ejemplo, en XML un elemento se define como una etiqueta inicial posiblemente seguida por contenido, seguido de una etiqueta final. El contenido se define a su vez como un elemento, datos de caracteres o algunas otras cosas posibles. Un patrón de definiciones autorreferenciales también está implícito en el estándar Unicode:
Cuando se enfrenta por primera vez con estas dos definiciones, el lector puede objetar la primera definición con el argumento de que un punto de código es un carácter, pero eso no siempre es cierto. Una secuencia de dos puntos de código a veces codifica un único punto de código bajo normalización , y ese punto de código codificado representa el carácter, como se ilustra en la figura 2.7 . Secuencias de puntos de código que codifican otros puntos de código. Esto se está volviendo un poco complicado y ni siquiera hemos llegado a la capa donde se utilizan esquemas de codificación de caracteres como UTF-8 para codificar puntos de código en secuencias de bytes.
En algunos contextos, por ejemplo, un artículo académico sobre diacríticos y la parte individual de un personaje pueden aparecer en el texto por sí mismos. En ese contexto, la parte de carácter individual podría considerarse un carácter, por lo que tiene sentido que el estándar Unicode también permanezca flexible.
Como Mark Avery señaló, un personaje puede ser compuesto en una cosa más compleja. Es decir, cada personaje puede servir como grafema si lo desea. El resultado final de toda composición es algo que "el usuario piensa como un personaje". No parece haber ninguna resistencia real, ni en el estándar ni en esta discusión, a la idea de que en el nivel más alto hay estas cosas en el texto que el usuario considera como caracteres individuales. Para evitar sobrecargar ese término, podemos usar "grafema" en todos los casos en los que queremos referirnos a las partes utilizadas para componer un personaje.
A veces, el estándar Unicode está por todas partes con su terminología. Por ejemplo, el Capítulo 3 define UTF-8 como una "forma de codificación", mientras que el glosario define "forma de codificación" como otra cosa, y UTF-8 como un "Esquema de codificación de caracteres". Otro ejemplo es "Grapheme_Base" y "Grapheme_Extend", que se reconocen como errores, pero que persisten porque purgarlos es una tarea difícil. Todavía queda trabajo por hacer para ajustar la terminología empleada por la norma.
La propuesta para agregar COMBINING GRAPHEME JOINER se equivocó cuando declaró que "los grafemas son secuencias de uno o más caracteres codificados que corresponden a lo que los usuarios consideran como caracteres". En su lugar, debería decir: "Una secuencia de uno o más grafemas compone lo que el usuario piensa como un personaje". Entonces podría usar el término "secuencia de grafemas" claramente del término "secuencia de caracteres". Ambos términos son útiles. La "secuencia de grafemas" implica claramente el proceso de construir un personaje a partir de piezas más pequeñas. "secuencia de caracteres" significa lo que todos normalmente intuimos que significa: "Una secuencia de cosas que el usuario considera como caracteres".
A veces, un programador realmente quiere operar al nivel de secuencias de grafemas, por lo que los mecanismos para inspeccionar y manipular esas secuencias deben estar disponibles, pero en general, cuando se procesa texto, es suficiente operar en "secuencias de caracteres" (lo que el usuario piensa como personaje) y dejar que el sistema gestione los detalles de nivel inferior.
En todos los casos cubiertos hasta ahora en esta discusión, es más claro usar "grafema" para referirse a los componentes indivisibles y "carácter" para referirse a la entidad compuesta. Este uso también refleja mejor los significados establecidos desde hace mucho tiempo de ambos términos.
fuente