¿Cuál es la diferencia entre un personaje, un punto de código, un glifo y un grafema?


146

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?


Hay muchos sistemas de escritura muy diferentes, para muchos idiomas diferentes. Por lo tanto, hay diferentes puntos de vista sobre el problema de la escritura, y también hay una larga historia detrás de él. En mi humilde opinión, es útil tener eso en cuenta, porque Unicode intenta cubrir todo . (¿La letra cursiva es igual o diferente? ¿Radicales kanji? ¿Hangul? ¿Diacríticos? ¿Emoji del color de la piel? ...)
Pablo H

Respuestas:


225
  • 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 ay ä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 base aseguido 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.


44
Acabo de enviar una edición que reorganizó el orden del punto de código y la unidad de código. Estoy de acuerdo con usted en que la unidad de código debería ser la segunda. En cuanto a estar "fuera de lugar", sospecho que ves esta respuesta como un propósito diferente al que yo hago. Creo que hay un gran valor en tener los 5 de estos términos en un solo lugar. Lo último que quiero es buscar en Google "cuál es la diferencia entre glifo, grafema, unidad de código y punto de código y tengo que obtener la respuesta en dos lugares. En muchas discusiones, estos términos se usan en la discusión, rara vez Veo una discusión con los otros 4 pero no con la unidad de código.
Micah Zoltu

1
Entonces, por ejemplo, '\ uD83D \ uDC0A' (que muestra un emoji de cocodrilo) ¿cuáles son los puntos de código, los grafemas, etc.? En particular, cómo se relaciona a .length, .codePointAt(0), .codePointAt(1), .charCodeAt(0)y .charCodeAt(1)los resultados?
qbolec

3
@qbolec: Son dos unidades de código UTF-16 que expresan un único punto de código (U + 1F40A), y dado que es un emoji, presumiblemente es su propio grafema único.
Kerrek SB

2
@ TomPažourek: en la canonicalización descompuesta, está representada por dos puntos de código ( amá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.
Kerrek SB

1
@Kaushik: No estoy seguro de lo que quieres decir: una unidad de código es una unidad de almacenamiento, sí, pero un punto de código en general requiere múltiples unidades de código para el almacenamiento (excepto en UTF-32).
Kerrek SB

1

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:

Un grafema es un punto de código o un personaje.

Un personaje está compuesto de una secuencia de uno o más grafemas.

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.


Un cauteloso -1; Creo que esto está mal. Implica que un personaje puede estar compuesto de muchos grafemas, pero siempre estará representado por un solo glifo; Creo que, de hecho, es al revés. Páginas como en.wikipedia.org/wiki/N-diaeresis sugieren que la combinación de una letra con un signo diacrítico (al menos uno que cambia su significado) forma un nuevo grafema distinto, y que el signo diacrítico no es un grafema en sí mismo. Mientras tanto, los glifos son claramente componibles s͈̘̻̗̝i̙̳̩̯̮̥ͅn̪̭̹̝c̪̣̗̞̜e̥̖̮̫̣̯ͅ ̯ͅI̪͉̜̼̼̣̟̣ ̰̟̥̞̹c͈͔͇̼a̙̹̼̦̲̞n̙̺̳̟ͅ ̤̗d̘̭̙̪̦o̬̲̜̺ ̲̬̝t̺̖̗̩̱h̟̟̱i̹s̹̱.̯̖̝̯̟̜̥
Mark Amery el

Agradezco la respuesta, que acabo de ver. Sin embargo, sigo pensando que su definición de grafemas es de hecho incorrecta o, al menos, está en desacuerdo con la forma en que Unicode define la palabra. Descarta la idea de que un grafema esté compuesto de personajes como "todo al revés", pero cavé un poco y encontré unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htm que literalmente comienza con la declaración " Los grafemas son secuencias de uno o más caracteres codificados " .
Mark Amery

Y esa declaración continúa, "... que corresponde a lo que los usuarios piensan como personajes". Incluso el término " grapheme-joiner ", así como el mecanismo detrás del término, es ilustrativo de lo que dije al comienzo de mi respuesta: lo que el estándar Unicode define como "caracteres" es en realidad una mezcla de grafemas y caracteres. Es más limpio llamar a los grafemas "grafemas" y caracteres "caracteres" en lugar de inventar contorsiones como " caracteres precompuestos " y " grupos de grafemas ".
Pobre Yorick

@PoorYorick Usted afirma que "... un personaje es una unidad individual de texto compuesta de uno o más grafemas" y "Los grafemas son los pequeños pedazos distintos. Los personajes están más desarrollados". ¿Tiene alguna referencia que respalde estas afirmaciones? Porque de alguna manera dudo, que el consorcio Unicode deliberadamente decidiera definir sus nombres de alguna manera "invertidos".
TS

@PoorYorick Comprendí tu punto de vista, antes de agregar esta explicación adicional, no es por eso que pregunté. Simplemente pedí referencias (léxico, artículos científicos, norma técnica, ...), porque no conocía ningún documento, que usa el grafema de la forma en que lo interpreta. (Los primeros resultados de Google para grapheme tampoco usan la palabra en tu camino). Agregaste una cita en bloque "Un grafema es un punto de código o un personaje. [...]" - pero ¿de dónde es? Al final dices "significados establecidos desde hace mucho tiempo de ambos términos". - Si está establecido, enlace a algo, es usar el término de esta manera.
TS
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.