Essayer de comprendre les subtilités de l'Unicode moderne me fait mal à la tête. En particulier, la distinction entre les points de code, les caractères, les glyphes et les graphèmes - concepts qui, dans le cas le plus simple, s’agissant du texte anglais utilisant ASCII, tous avoir une relation un à un avec l'autre - me cause des problèmes.
Voyant comment ces termes sont utilisés dans des documents tels que Matthias Bynens ' JavaScript a un problème unicode ou l'article de Wikipedia sur Han unification , j'ai compris que ces concepts ne sont pas la même chose et qu'il est dangereux de les confondre, mais j'ai un peu de mal à comprendre ce que chaque terme signifie.
Le consortium Unicode propose un glossaire pour expliquer cela, mais il regorge de "définitions" comme celle-ci:
Caractère abstrait. Unité d'information utilisée pour l'organisation, le contrôle ou la représentation de données textuelles. ...
...
Caractère. ... (2) Synonyme de caractère abstrait. (3) Unité de base du codage pour le codage de caractères Unicode. ...
...
Glyph. (1) Une forme abstraite qui représente une ou plusieurs images de glyphes. (2) Un synonyme pour une image de glyphe. Lors de l'affichage des données de caractères Unicode, un ou plusieurs glyphes peuvent être sélectionnés pour décrire un caractère particulier.
...
Grapheme. (1) Unité d’écriture peu distinctive dans le contexte d’un système d’écriture particulier. ...
La plupart de ces définitions possèdent la qualité de résonance très académique et formelle, mais ne possèdent pas la qualité de ce qui veut dire quoi que ce soit, sinon le problème de la définition est reporté à une autre entrée de glossaire ou section du standard.
Je cherche donc la sagesse profane de ceux qui sont plus savants que moi. Comment exactement ces concepts diffèrent-ils les uns des autres et dans quelles circonstances n'auraient-ils pas une relation un à un?
Caractère est un terme surchargé qui peut vouloir dire beaucoup de choses.
A point de code est l'unité d'information atomique. Texte est une séquence de points de code. Chaque point de code est un nombre qui a une signification donnée par le standard Unicode.
A nité de code est l'unité de stockage d'un partie d'un point de code codé. En UTF-8, cela signifie 8 bits, en UTF-16, cela signifie 16 bits. Une seule unité de code peut représenter un point de code complet ou une partie d'un point de code. Par exemple, le glyphe de bonhomme de neige (☃
) est un point de code unique mais 3 unités de code UTF-8 et 1 unité de code UTF-16.
Un grapheme est une séquence d'un ou de plusieurs points de code affichés sous forme d'une seule unité graphique qu'un lecteur reconnaît comme un seul élément du système d'écriture. Par exemple, a
et ä
sont des graphèmes, mais ils peuvent être constitués de plusieurs points de code (par exemple, ä
peut être deux points de code, un pour le caractère de base a
suivi d'un pour la diarèse; mais il existe également une alternative, héritée, un seul point de code représentant ce graphème). Certains points de code ne font jamais partie d’un graphème (par exemple, les largeurs non jointives de largeur nulle ou les substitutions directionnelles).
Un glyph est une image, généralement stockée dans un font (qui est une collection de glyphes), utilisée pour représenter des graphèmes ou des parties de ceux-ci. Les polices peuvent composer plusieurs glyphes en une seule représentation, par exemple, si le ä
est un point de code unique, une police peut choisir de le rendre sous forme de deux glyphes distincts superposés dans l’espace. Pour OTF, les tables GSUB et GPOS de la police contiennent des informations sur la substitution et le positionnement pour que cela fonctionne. Une police peut également contenir plusieurs glyphes alternatifs pour le même graphème.
En dehors de la norme Unicode, un caractère est une unité individuelle de texte composée de un ou plusieurs graphèmes . Ce que la norme Unicode définit comme "caractères" est en réalité un mélange de graphèmes et de caractères. Unicode fournit des règles pour l'interprétation des graphèmes juxtaposés en tant que caractères individuels.
A nicodepoint de code est un numéro unique attribué à chacun caractère Unicode (qui est un caractère ou un graphème).
Malheureusement, les règles Unicode permettent à certains graphèmes juxtaposés d'être interprétés comme d'autres graphèmes ayant déjà leurs propres points de code (formulaires précomposés ) Cela signifie que, dans Unicode, il existe plus d’une manière de représenter un caractère. normalisation Unicode résout ce problème.
Un glyphe est la représentation visuelle d'un personnage. Une police fournit un ensemble de glyphes pour un certain ensemble de caractères (pas des caractères Unicode). Pour chaque caractère, il existe un nombre infini de glyphes possibles.
Une réponse à Mark Amery
Premièrement, comme je l'ai dit, il y a un nombre infini de glyphes possibles pour chaque caractère, donc non, un caractère n'est pas "toujours représenté par un seul glyphe". Unicode ne s'intéresse pas beaucoup aux glyphes et les éléments qu'il définit dans ses tableaux de code ne sont certainement pas des glyphes. Le problème est que ni l'un ni l'autre ne sont tous des personnages. Alors qu'est-ce qu'ils sont?
Quelle est la plus grande entité, le graphème ou le personnage? Comment appelle-t-on ces éléments graphiques dans le texte qui ne sont ni des lettres ni des signes de ponctuation? Un terme qui me vient rapidement à l’esprit est "graphème". C'est un mot qui évoque précisément l'idée d'une "unité graphique dans un texte". J'offre cette définition: Un graphème est le plus petit composant distinct d'un texte écrit .
On pourrait aller dans l’autre sens et dire que les graphèmes sont composés de caractères, mais ils s’appelleraient alors "graphèmes chinois", et tous ces morceaux qui composent les graphèmes chinois devraient plutôt être appelés "caractères". Cependant, tout cela est en arrière. Les graphèmes sont les petits morceaux distincts. Les personnages sont plus développés. L'expression "les glyphes sont composables" serait mieux définie dans le contexte d'Unicode car "les caractères sont composables".
Unicode définit les caractères, mais également les graphèmes à composer avec d'autres graphèmes ou caractères. Les monstruosités que vous avez composées en sont un bon exemple. S'ils comprennent, ils obtiendront peut-être leurs propres points de code dans une version ultérieure d'Unicode;)
Tout cela comporte un élément récursif. À des niveaux plus élevés, les graphèmes deviennent des caractères et deviennent des graphèmes, mais ce sont des graphèmes jusqu'au bout.
Une réponse à T S
Chapitre 1 des états standard: "Le codage de caractères Unicode traite les caractères alphabétiques, les caractères idéographiques et les symboles de manière équivalente, ce qui signifie qu'ils peuvent être utilisés dans n'importe quel mélange et avec la même facilité". Compte tenu de cette déclaration, nous devrions être prêts à une certaine confusion des termes dans la norme. Parfois, la terminologie appropriée ne devient claire qu'avec le recul d'une norme.
Il arrive souvent, dans les définitions formelles d’une langue, que deux choses fondamentales soient définies l’une par l’autre. Par exemple, dans XML , un élément est défini comme une balise de début éventuellement suivie d'un contenu, suivi d'une balise de fin. Le contenu est défini à son tour comme un élément, des données de personnage ou quelques autres choses possibles. Un modèle de définitions auto-référentielles est également implicite dans le standard Unicode:
Un graphème est un point de code ou un caractère.
Un personnage est composé d'une séquence d'un ou plusieurs graphèmes.
Lorsqu'il est confronté pour la première fois à ces deux définitions, le lecteur peut s'opposer à la première définition au motif qu'un point de code est un caractère, mais ce n'est pas toujours vrai. Une séquence de deux points de code code parfois un seul point de code sous normalisation , et ce point de code codé représente le caractère, comme illustré dans figure 2.7 . Séquences de points de code qui encodent d'autres points de code. Cela devient un peu délicat et nous n’avons même pas atteint la couche où des schémas de codage de caractères tels que TF-8 sont utilisés pour coder des points de code en séquences d’octets.
Dans certains contextes, par exemple, un article savant sur diacritiques , et une partie individuelle d'un caractère peuvent apparaître dans le texte lui-même. Dans ce contexte, la partie de caractère individuelle peut être considérée comme un caractère. Il est donc logique que la norme Unicode reste également flexible.
Comme Mark Avery l'a souligné, un personnage peut être composé de manière plus complexe. C'est-à-dire que chaque personnage peut servir de graphème si désiré. Le résultat final de toute composition est une chose que "l'utilisateur considère comme un personnage". Il ne semble pas y avoir de réelle résistance, ni dans la norme, ni dans la présente discussion, à l'idée qu'au plus haut niveau, il y a ces éléments dans le texte que l'utilisateur considère comme des caractères individuels. Pour éviter de surcharger ce terme, nous pouvons utiliser "graphème" dans tous les cas où nous voulons faire référence à des parties utilisées pour composer un caractère.
Parfois, la norme Unicode est omniprésente avec sa terminologie. Par exemple, Chapitre définit UTF-8 en tant que "forme de codage" alors que le glossaire définit "forme de codage" comme autre chose, et UTF-8 en tant que "schéma de codage de caractères". Un autre exemple est "Grapheme_Base" et "Grapheme_Extend", qui sont reconnus sont des erreurs mais persistent, car les purger est un peu une tâche. Il reste encore du travail à faire pour resserrer la terminologie employée par la norme.
Le Proposition d’ajout de COMBINING GRAPHEME JOINER s’est trompé en déclarant que "les graphèmes sont des séquences d’un ou de plusieurs caractères codés correspondant à ce que les utilisateurs considèrent comme des caractères". Il devrait plutôt indiquer "Une séquence d'un ou plusieurs graphèmes compose ce que l'utilisateur considère comme un caractère". Ensuite, il pourrait utiliser le terme "séquence graphème" distinctement du terme "séquence de caractères". Les deux termes sont utiles. "séquence de graphème" implique clairement le processus de construction d'un personnage à partir de petites pièces. "séquence de caractères" signifie ce que nous entendons tous couramment comme suit: "Une séquence de choses que l'utilisateur considère comme des caractères".
Parfois, un programmeur veut vraiment opérer au niveau des séquences de graphèmes, donc des mécanismes pour inspecter et manipuler ces séquences devraient être disponibles, mais généralement, lors du traitement de texte, il suffit de manipuler des "séquences de caractères" (ce que l'utilisateur pense de en tant que personnage) et laissez le système gérer les détails de niveau inférieur.
Dans tous les cas abordés jusqu'à présent dans cette discussion, il est préférable d'utiliser "grapheme" pour désigner les composants indivisibles et "personnage" pour désigner l'entité composée. Cet usage reflète également mieux les significations établies de longue date des deux termes.