Quelle est la différence entre un caractère, un point de code, un glyphe et un graphème?

148

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 , lorsqu'il s'agit de texte anglais utilisant des caractères ASCII, ont tous une relation un à un les uns avec les autres - me cause des problèmes.

En voyant comment ces termes sont utilisés dans des documents comme le JavaScript de Matthias Bynens a un problème unicode ou l'article de Wikipedia sur l' unification des Han , j'ai compris que ces concepts ne sont pas la même chose et qu'il est dangereux de les confondre, mais je suis un peu du mal à comprendre ce que signifie chaque terme .

Le Consortium Unicode propose un glossaire pour expliquer tout cela, mais il est plein 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) L'unité de base du codage pour le codage de caractères Unicode. ...

...

Glyphe . (1) Forme abstraite qui représente une ou plusieurs images de glyphes. (2) Un synonyme d'image de glyphe. Lors de l'affichage des données de caractère Unicode, un ou plusieurs glyphes peuvent être sélectionnés pour représenter un caractère particulier.

...

Graphème . (1) Une unité d'écriture minimalement distinctive dans le contexte d'un système d'écriture particulier. ...

La plupart de ces définitions possèdent la qualité de paraître très académique et formelle, mais n'ont pas la qualité de signifier quoi que ce soit , ou bien reportent le problème de la définition à une autre entrée ou section de glossaire de la norme.

Je recherche donc la sagesse obscure de ceux qui sont plus savants que moi. Comment exactement chacun de ces concepts diffère-t-il les uns des autres, et dans quelles circonstances n'auraient-ils pas une relation individuelle les uns avec les autres?

Mark Amery
la source
Il existe de nombreux systèmes d'écriture très différents, pour de nombreuses langues différentes. Il y a donc des points de vue différents sur le problème de l'écriture, et il y a aussi une longue histoire derrière cela. IMHO, il est utile de garder cela à l'esprit, car Unicode essaie de tout couvrir . (Le caractère cursif est-il identique ou différent? Radicaux kanji? Hangul? Diacritiques? Emoji couleur de peau ?? ...)
Pablo H

Réponses:

226
  • Le caractère est un terme surchargé qui peut signifier beaucoup de choses.

  • Un point de code est l'unité atomique d'information. Le texte est une séquence de points de code. Chaque point de code est un nombre dont la signification est donnée par la norme Unicode.

  • Une unité de code est l'unité de stockage d'une 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 graphème est une séquence d'un ou plusieurs points de code qui sont affichés sous la forme d'une seule unité graphique qu'un lecteur reconnaît comme un élément unique du système d'écriture. Par exemple, les deux aet äsont des graphèmes, mais ils peuvent être constitués de plusieurs points de code (par exemple, il äpeut s'agir de deux points de code, un pour le caractère de base asuivi d'un autre pour le diarésie; mais il existe également un autre point de code unique, hérité, représentant ce graphème ). Certains points de code ne font jamais partie d'un graphème (par exemple, le non-jointeur de largeur zéro ou les remplacements directionnels).

  • Un glyphe est une image, généralement stockée dans une police (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 ce qui précède äest un point de code unique, une police peut choisir de le rendre sous la forme de deux glyphes séparés, superposés spatialement. Pour OTF, les tables GSUB et GPOS de la police contiennent des informations de substitution et de positionnement pour que cela fonctionne. Une police peut également contenir plusieurs glyphes alternatifs pour le même graphème.

Kerrek SB
la source
4
Je viens de soumettre une modification qui a réorganisé l'ordre du point de code et de l'unité de code. Je suis d'accord avec vous que l'unité de code devrait venir en second. Quant au fait d'être «déplacé», je soupçonne que vous voyez cette réponse comme ayant un but différent de celui que je fais. Je pense qu'il est très utile de regrouper ces 5 termes au même endroit. La dernière chose que je veux est de rechercher sur Google "quelle est la différence entre glyphe, graphème, unité de code et point de code et avoir la réponse à deux endroits. Dans de nombreuses discussions, ces termes sont tous utilisés dans la discussion, rarement Je vois une discussion avec les 4 autres mais pas avec l'unité de code.
Micah Zoltu
1
Ainsi, par exemple '\ uD83D \ uDC0A' (qui montre un emoji de crocodile) quels sont les points de code, les graphèmes, etc.? En particulier, comment est - elle liée à .length, .codePointAt(0), .codePointAt(1), .charCodeAt(0)et les .charCodeAt(1)résultats?
qbolec le
3
@qbolec: Ce sont deux unités de code UTF-16 exprimant un seul point de code (U + 1F40A), et étant donné qu'il s'agit d'un emoji, il s'agit probablement de son propre graphème unique.
Kerrek SB du
2
@ TomPažourek: dans la canonisation décomposée, elle est représentée par deux points de code ( aplus "combinaison diacritique"); dans la canonisation composée, il est représenté par un seul point de code ( äde l'ancienne gamme Latin-1). La canonisation Unicode est le sujet que vous souhaitez étudier si cela vous intéresse. Dans un monde en ardoise vierge, il n'y aurait que des personnages de base et de combinaison et pas de composites prédéfinis.
Kerrek SB
1
@Kaushik: Je ne suis pas sûr de ce que vous voulez dire: une unité de code est une unité de stockage, oui, mais un point de code en général nécessite plusieurs unités de code pour le stockage (sauf en UTF-32).
Kerrek SB
1

En dehors de la norme Unicode, un caractère est une unité individuelle de texte composée d'un ou plusieurs graphèmes . Ce que la norme Unicode définit comme "caractères" est en fait 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.

Un point de code Unicode est un numéro unique attribué à chaque caractère Unicode (qui est soit un caractère soit un graphème).

Malheureusement, les règles Unicode permettent à certains graphèmes juxtaposés d'être interprétés comme d'autres graphèmes qui ont déjà leurs propres points de code ( formes précomposées ). Cela signifie qu'il existe plusieurs façons en Unicode de représenter un caractère. La 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 se préoccupe pas beaucoup des glyphes, et les choses qu'il définit dans ses graphiques de code ne sont certainement pas des glyphes. Le problème est qu'ils ne sont pas tous non plus des personnages. Alors que sont-ils?

Quelle est la plus grande entité, le graphème ou le caractère? Comment appelle-t-on ces éléments graphiques dans le texte qui ne sont pas des lettres ou de la ponctuation? Un terme qui 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 dans un texte écrit .

On pourrait aller dans l'autre sens et dire que les graphèmes sont composés de caractères, mais alors ils seraient appelés "graphèmes chinois", et tous ces bits et morceaux de graphèmes chinois devraient être appelés "caractères" à la place. Cependant, tout est à l'envers. Les graphèmes sont les petits morceaux distincts. Les personnages sont plus développés. L'expression «les glyphes sont composables» serait mieux énoncée dans le contexte d'Unicode car «les caractères sont composables».

Unicode définit des caractères mais il définit également des graphèmes qui doivent être composés avec d'autres graphèmes ou caractères. Ces monstruosités que vous avez composées en sont un bel exemple. S'ils comprennent peut-être qu'ils obtiendront leurs propres points de code dans une version ultérieure d'Unicode;)

Il y a un élément récursif dans tout cela. À des niveaux plus élevés, les graphèmes deviennent des caractères deviennent des graphèmes, mais ce sont des graphèmes tout en bas.

Une réponse à TS

Le chapitre 1 de la norme stipule: "Le codage des 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 affirmation, nous devons nous préparer à une certaine confusion des termes de la norme. Parfois, la terminologie appropriée ne devient claire que rétrospectivement à mesure qu'une norme se développe.

Il arrive souvent dans les définitions formelles d'une langue que deux choses fondamentales soient définies l'une par rapport à l'autre. Par exemple, en XML, un élément est défini comme une balise de départ éventuellement suivie d'un contenu, suivie d'une balise de fin. Le contenu est défini à son tour comme un élément, des données de caractère ou quelques autres choses possibles. Un modèle de définitions autoréférentielles est également implicite dans la norme Unicode:

Un graphème est un point de code ou un caractère.

Un caractère 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 la figure 2.7 . Séquences de points de code qui codent d'autres points de code. Cela devient un peu délicat et nous n'avons même pas atteint la couche où les schémas de codage de caractères tels que UTF-8 sont utilisés pour coder des points de code en séquences d'octets.

Dans certains contextes, par exemple, un article scientifique sur les signes diacritiques et une partie individuelle d'un personnage peuvent apparaître seuls dans le texte. Dans ce contexte, la partie de caractère individuelle pourrait être considérée comme un caractère, il est donc logique que la norme Unicode reste également flexible.

Comme l'a souligné Mark Avery, un personnage peut être composé en une chose plus complexe. Autrement dit, chaque caractère peut servir de graphème si on le souhaite. 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, que ce soit dans la norme ou dans cette discussion, à l'idée qu'au plus haut niveau, il y a ces choses dans le texte que l'utilisateur considère comme des personnages individuels. Pour éviter de surcharger ce terme, on peut utiliser "graphème" dans tous les cas où l'on veut se référer aux parties utilisées pour composer un caractère.

Parfois, la norme Unicode est partout avec sa terminologie. Par exemple, le chapitre 3 définit UTF-8 comme une «forme d'encodage» alors que le glossaire définit «forme d'encodage» comme autre chose, et UTF-8 comme un «schéma d'encodage de caractères». Un autre exemple est "Grapheme_Base" et "Grapheme_Extend", qui sont reconnus comme des erreurs mais qui 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.

La proposition d'ajout de COMBINING GRAPHEME JOINER s'est trompée lorsqu'elle a déclaré que "les graphèmes sont des séquences d'un ou plusieurs caractères codés qui correspondent à ce que les utilisateurs considèrent comme des caractères." Il devrait plutôt lire: "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 de graphèmes» distinctement du terme «séquence de caractères». Les deux termes sont utiles. «séquence de graphèmes» implique proprement le processus de construction d'un personnage à partir de morceaux plus petits. "séquence de caractères" signifie ce que nous entendons tous généralement par l'intuition: "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 d'opérer sur des "séquences de caractères" (ce à quoi l'utilisateur pense 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 plus propre d'utiliser «graphème» pour désigner les composants indivisibles et «caractère» pour désigner l'entité composée. Cet usage reflète également mieux les significations établies de longue date des deux termes.

Pauvre Yorick
la source
Un -1 prudent; Je pense que c'est faux. Vous impliquez qu'un caractère peut être composé de plusieurs graphèmes, mais sera toujours représenté par un seul glyphe; Je pense en fait que c'est l'inverse. Des pages comme en.wikipedia.org/wiki/N-diaeresis suggèrent que la combinaison d'une lettre avec un diacritique (au moins un qui change sa signification) forme un nouveau graphème distinct, et que le diacritique n'est pas un graphème en soi. Pendant ce temps, les glyphes sont clairement composables s͈̘̻̗̝i̙̳̩̯̮̥ͅn̪̭̹̝c̪̣̗̞̜e̥̖̮̫̣̯ͅ ̯ͅI̪͉̜̼̼̣̟̣ ̰̟̥̞̹c͈͔͇̼a̙̹̼̦̲̞n̙̺̳̟ͅ ̤̗d̘̭̙̪̦o̬̲̜̺ ̲̬̝t̺̖̗̩̱h̟̟̱i̹s̹̱.̯̖̝̯̟̜̥
Mark Amery
J'apprécie la réponse que je viens de voir. Cependant, je pense toujours que votre définition des graphèmes est en fait incorrecte, ou du moins en contradiction avec la façon dont Unicode définit le mot. Vous rejetez l'idée d'un graphème composé de caractères comme étant "tout à l'envers", mais j'ai creusé un peu et j'ai trouvé unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htm qui commence littéralement par l'instruction " Les graphèmes sont des séquences d'un ou plusieurs caractères codés " .
Mark Amery
Et cette déclaration continue, "... qui correspondent à ce que les utilisateurs considèrent comme des personnages." Même le terme « graphème-menuisier », ainsi que le mécanisme derrière le terme, illustre ce que j'ai déclaré au début de ma réponse: ce que la norme Unicode définit comme «caractères» est en fait un mélange de graphèmes et de caractères. Il est plus simple d'appeler graphèmes "graphèmes" et caractères "caractères" plutôt que d'inventer des contorsions telles que " caractères précomposés " et " grappes de graphèmes ".
Poor Yorick
@PoorYorick Vous prétendez que "... un caractère est une unité individuelle de texte composée d'un ou plusieurs graphèmes" et "Les graphèmes sont les petits morceaux distincts. Les caractères sont plus développés". Avez-vous des références qui appuient ces affirmations? Parce que je doute en quelque sorte, que le consortium Unicode ait délibérément décidé de définir leurs noms en quelque sorte «inversés».
TS
@PoorYorick J'ai compris votre point, avant d'ajouter cette explication supplémentaire, ce n'est pas pourquoi j'ai demandé. J'ai simplement demandé des références (lexique, articles scientifiques, norme technique, ...), car je ne connaissais aucun document, qui utilise le graphème tel que vous l'interprétez. (Les premiers résultats Google pour graphème n'utilisent pas non plus le mot à votre manière). Vous avez ajouté un blockquote "Un graphème est un point de code ou un caractère. [...]" - mais d'où vient-il? À la fin, vous dites «significations établies de longue date des deux termes». - S'il est établi, alors un lien vers quelque chose, c'est utiliser le terme de cette façon.
TS