Was ist der Unterschied zwischen einem Zeichen, einem Codepunkt, einem Glyphen und einem Graphem?


146

Der Versuch, die Feinheiten des modernen Unicode zu verstehen, schmerzt meinen Kopf. Insbesondere die Unterscheidung zwischen Codepunkten, Zeichen, Glyphen und Graphemen - Konzepte, die im einfachsten Fall beim Umgang mit englischem Text mit ASCII-Zeichen eine Eins-zu-Eins-Beziehung zueinander haben - bereitet mir Probleme.

Als ich sah, wie diese Begriffe in Dokumenten wie Matthias Bynens ' JavaScript verwendet werden, hat es ein Unicode-Problem oder Wikipedia- Artikel über die Han-Vereinigung . Ich habe festgestellt, dass diese Konzepte nicht dasselbe sind und dass es gefährlich ist, sie zusammenzuführen, aber ich bin irgendwie kämpfen, um zu verstehen, was jeder Begriff bedeutet .

Das Unicode-Konsortium bietet ein Glossar , um dieses Zeug zu erklären, aber es ist voll von "Definitionen" wie diesen:

Abstrakter Charakter . Eine Informationseinheit, die für die Organisation, Kontrolle oder Darstellung von Textdaten verwendet wird. ...

...

Charakter . ... (2) Synonym für abstrakten Charakter. (3) Die grundlegende Codierungseinheit für die Unicode-Zeichencodierung. ...

...

Glyphe . (1) Eine abstrakte Form, die ein oder mehrere Glyphenbilder darstellt. (2) Ein Synonym für Glyphenbild. Bei der Anzeige von Unicode-Zeichendaten können ein oder mehrere Glyphen ausgewählt werden, um ein bestimmtes Zeichen darzustellen.

...

Graphem . (1) Eine minimal unterscheidbare Schreibeinheit im Kontext eines bestimmten Schriftsystems. ...

Die meisten dieser Definitionen haben die Qualität, sehr akademisch und formal zu klingen, aber es fehlt ihnen die Qualität , irgendetwas zu bedeuten , oder sie verschieben das Definitionsproblem auf einen weiteren Glossareintrag oder Abschnitt des Standards.

Also suche ich die arkane Weisheit derer, die mehr gelernt haben als ich. Wie genau unterscheiden sich diese Konzepte voneinander und unter welchen Umständen würden sie keine Eins-zu-Eins-Beziehung zueinander haben?


Es gibt viele sehr unterschiedliche Schriftsysteme für viele verschiedene Sprachen. Daher gibt es unterschiedliche Ansichten zum Problem des Schreibens, und es steckt auch eine lange Geschichte dahinter. IMHO ist es nützlich, dies zu berücksichtigen, da Unicode versucht, alles abzudecken . (Ist Kursiv gleich oder verschieden? Kanji-Radikale? Hangul? Diakritika? Hautfarbenes Emoji ?? ...)
Pablo H

Antworten:


225
  • Charakter ist ein überladener Begriff, der viele Dinge bedeuten kann.

  • Ein Codepunkt ist die atomare Informationseinheit. Text ist eine Folge von Codepunkten. Jeder Codepunkt ist eine Zahl, die vom Unicode-Standard eine Bedeutung erhält.

  • Eine Codeeinheit ist die Speichereinheit eines Teils eines codierten Codepunkts. In UTF-8 bedeutet dies 8 Bit, in UTF-16 bedeutet dies 16 Bit. Eine einzelne Codeeinheit kann einen vollständigen Codepunkt oder einen Teil eines Codepunkts darstellen. Beispielsweise ist das Schneemann-Glyphen ( ) ein einzelner Codepunkt, jedoch 3 UTF-8-Codeeinheiten und 1 UTF-16-Codeeinheit.

  • Ein Graphem ist eine Folge von einem oder mehreren Codepunkten, die als einzelne grafische Einheit angezeigt werden, die ein Leser als einzelnes Element des Schriftsystems erkennt. Zum Beispiel sind beide aund äGrapheme, aber sie können aus mehreren Codepunkten bestehen (z. B. äzwei Codepunkte, aeiner für das Basiszeichen, gefolgt von einem für die Diarese), aber es gibt auch einen alternativen Legacy-Einzelcodepunkt, der dieses Graphem darstellt ). Einige Codepunkte sind niemals Teil eines Graphems (z. B. der Nicht-Joiner mit der Breite Null oder Richtungsüberschreibungen).

  • Eine Glyphe ist ein Bild, das normalerweise in einer Schriftart (einer Sammlung von Glyphen) gespeichert wird und zur Darstellung von Graphemen oder Teilen davon verwendet wird. Schriftarten können mehrere Glyphen zu einer einzigen Darstellung zusammensetzen. Wenn das Obige äbeispielsweise ein einzelner Codepunkt ist, kann eine Schriftart diese als zwei separate, räumlich überlagerte Glyphen rendern. Für OTF enthalten die GSUB- und GPOS-Tabellen der Schriftart Substitutions- und Positionierungsinformationen, damit dies funktioniert. Eine Schriftart kann auch mehrere alternative Glyphen für dasselbe Graphem enthalten.


4
Ich habe gerade eine Bearbeitung eingereicht, bei der die Reihenfolge von Codepunkt und Codeeinheit neu angeordnet wurde. Ich stimme Ihnen zu, dass die Codeeinheit an zweiter Stelle stehen sollte. Ich vermute, dass Sie diese Antwort als "fehl am Platz" ansehen und einen anderen Zweck erfüllen als ich. Ich denke, es ist sehr wertvoll, alle fünf Begriffe an einem Ort zu haben. Das Letzte, was ich möchte, ist, nach "Was ist der Unterschied zwischen Glyphe, Graphem, Codeeinheit und Codepunkt?" Zu googeln und die Antwort an zwei Stellen zu erhalten. In vielen Diskussionen werden diese Begriffe alle in der Diskussion verwendet, selten Ich sehe eine Diskussion mit den anderen 4, aber nicht mit der
Codeeinheit

1
Also zum Beispiel '\ uD83D \ uDC0A' (das ein Krokodil-Emoji zeigt), was sind die Codepunkte, Graphems usw.? Insbesondere in welcher Beziehung steht es zu .length, .codePointAt(0), .codePointAt(1), .charCodeAt(0)und .charCodeAt(1)Ergebnisse?
Qbolec

3
@qbolec: Dies sind zwei UTF-16-Codeeinheiten, die einen einzelnen Codepunkt (U + 1F40A) ausdrücken. Da es sich um ein Emoji handelt, handelt es sich vermutlich um ein eigenes einzelnes Graphem.
Kerrek SB

2
@ TomPažourek: In der zerlegten Kanonisierung wird es durch zwei Codepunkte dargestellt ( aplus "Kombination von diakritisch"); In der komponierten Kanonisierung wird es durch einen einzelnen Codepunkt dargestellt ( äaus dem alten lateinischen 1-Bereich). Die Unicode-Kanonisierung ist das Thema, das Sie untersuchen möchten, wenn Sie dies interessiert. In einer leeren Welt würde es nur Basis- und Kombinationszeichen und keine vorgefertigten Verbundwerkstoffe geben.
Kerrek SB

1
@Kaushik: Ich bin mir nicht sicher, was Sie meinen: Eine Codeeinheit ist eine Speichereinheit, ja, aber ein Codepunkt erfordert im Allgemeinen mehrere Codeeinheiten für die Speicherung (außer in UTF-32).
Kerrek SB

1

Außerhalb des Unicode-Standards ist ein Zeichen eine einzelne Texteinheit, die aus einem oder mehreren Graphemen besteht . Was der Unicode-Standard als "Zeichen" definiert, ist eigentlich eine Mischung aus Graphemen und Zeichen. Unicode bietet Regeln für die Interpretation nebeneinander angeordneter Grapheme als einzelne Zeichen.

Ein Unicode- Codepunkt ist eine eindeutige Nummer, die jedem Unicode-Zeichen zugewiesen wird (entweder ein Zeichen oder ein Graphem).

Leider erlauben die Unicode-Regeln, dass einige nebeneinander angeordnete Grapheme als andere Grapheme interpretiert werden, die bereits ihre eigenen Codepunkte haben ( vorkomposierte Formulare ). Dies bedeutet, dass es in Unicode mehrere Möglichkeiten gibt, ein Zeichen darzustellen. Die Unicode-Normalisierung behebt dieses Problem.

Eine Glyphe ist die visuelle Darstellung eines Zeichens. Eine Schriftart enthält eine Reihe von Glyphen für eine bestimmte Reihe von Zeichen (keine Unicode-Zeichen). Für jedes Zeichen gibt es unendlich viele mögliche Glyphen.

Eine Antwort an Mark Amery

Erstens gibt es, wie gesagt, eine unendliche Anzahl möglicher Glyphen für jedes Zeichen, also nein, ein Zeichen wird nicht "immer durch ein einzelnes Glyphen dargestellt". Unicode beschäftigt sich nicht viel mit Glyphen, und die Dinge, die es in seinen Codetabellen definiert, sind sicherlich keine Glyphen. Das Problem ist, dass sie nicht alle Charaktere sind. Also was sind sie?

Welches ist die größere Entität, das Graphem oder der Charakter? Wie nennt man diese grafischen Elemente im Text, die keine Buchstaben oder Satzzeichen sind? Ein Begriff, der schnell in den Sinn kommt, ist "Graphem". Es ist ein Wort, das genau die Idee einer "grafischen Einheit in einem Text" heraufbeschwört. Ich biete diese Definition an: Ein Graphem ist die kleinste eigenständige Komponente in einem geschriebenen Text .

Man könnte in die andere Richtung gehen und sagen, dass Grapheme aus Zeichen bestehen, aber dann würden sie "chinesische Grapheme" genannt, und all diese Teile, aus denen chinesische Grapheme bestehen, müssten stattdessen "Zeichen" genannt werden. Das ist jedoch alles rückwärts. Grapheme sind die einzelnen Kleinigkeiten. Charaktere sind weiter entwickelt. Der Ausdruck "Glyphen sind zusammensetzbar" würde im Zusammenhang mit Unicode besser ausgedrückt werden als "Zeichen sind zusammensetzbar".

Unicode definiert Zeichen, aber es definiert auch Grapheme, die mit anderen Graphemen oder Zeichen zusammengesetzt werden sollen. Diese Monstrositäten, die Sie komponiert haben, sind ein gutes Beispiel dafür. Wenn sie es verstehen, bekommen sie vielleicht ihre eigenen Codepunkte in einer späteren Version von Unicode;)

All dies hat ein rekursives Element. Auf höheren Ebenen werden Grapheme zu Zeichen zu Graphemen, aber es sind Grapheme ganz unten.

Eine Antwort an TS

In Kapitel 1 des Standards heißt es: "Die Unicode-Zeichenkodierung behandelt alphabetische Zeichen, ideografische Zeichen und Symbole gleich, was bedeutet, dass sie in jeder Mischung und mit gleicher Leichtigkeit verwendet werden können." Angesichts dieser Aussage sollten wir auf eine gewisse Verschmelzung von Begriffen im Standard vorbereitet sein. Manchmal wird die richtige Terminologie erst im Nachhinein klar, wenn sich ein Standard entwickelt.

In formalen Definitionen einer Sprache kommt es häufig vor, dass zwei grundlegende Dinge in Bezug aufeinander definiert werden. In XML wird ein Element beispielsweise als Start-Tag definiert, möglicherweise gefolgt von Inhalt, gefolgt von einem End-Tag. Inhalt wird wiederum entweder als Element, Zeichendaten oder einige andere mögliche Dinge definiert. Ein Muster selbstreferenzieller Definitionen ist auch im Unicode-Standard enthalten:

Ein Graphem ist ein Codepunkt oder ein Zeichen.

Ein Zeichen besteht aus einer Folge von einem oder mehreren Graphemen.

Wenn er erstmals mit diesen beiden Definitionen konfrontiert den Leser könnte auf die erste Definition Objekt der Begründung , dass ein Codepunkt ist ein Charakter, aber das ist nicht immer wahr. Eine Folge von zwei Codepunkten codiert manchmal einen einzelnen Codepunkt unter Normalisierung , und dieser codierte Codepunkt repräsentiert das Zeichen, wie in Abbildung 2.7 dargestellt . Sequenzen von Codepunkten, die andere Codepunkte codieren. Dies wird etwas knifflig und wir haben noch nicht einmal die Ebene erreicht, in der Zeichenkodierungsschemata wie UTF-8 zum Codieren von Codepunkten in Byte-Sequenzen verwendet werden.

In einigen Kontexten kann beispielsweise ein wissenschaftlicher Artikel über Diakritika und einzelne Teile eines Zeichens im Text selbst erscheinen. In diesem Zusammenhang kann der einzelne Zeichenteil als Zeichen betrachtet werden. Daher ist es sinnvoll, dass auch der Unicode-Standard flexibel bleibt.

Wie Mark Avery betonte, kann eine Figur zu einer komplexeren Sache zusammengesetzt werden. Das heißt, jedes Zeichen kann auf Wunsch als Graphem dienen. Das Endergebnis aller Kompositionen ist eine Sache, die "der Benutzer als Charakter betrachtet". Es scheint weder im Standard noch in dieser Diskussion einen wirklichen Widerstand gegen die Idee zu geben, dass auf höchster Ebene diese Dinge im Text enthalten sind, die der Benutzer als einzelne Zeichen betrachtet. Um eine Überladung dieses Begriffs zu vermeiden, können wir "grapheme" in allen Fällen verwenden, in denen wir auf Teile verweisen möchten, die zum Erstellen eines Zeichens verwendet werden.

Manchmal ist der Unicode-Standard mit seiner Terminologie allgegenwärtig. In Kapitel 3 wird beispielsweise UTF-8 als "Codierungsform" definiert, während im Glossar "Codierungsform" als etwas anderes und UTF-8 als "Zeichencodierungsschema" definiert wird. Ein anderes Beispiel ist „Grapheme_Base“ und „Grapheme_Extend“, die anerkannten Fehler zu sein, aber das bestehen bleiben , weil sie das Spülen ein bisschen einer Aufgabe. Es bleibt noch viel zu tun, um die vom Standard verwendete Terminologie zu verschärfen.

Der Vorschlag zur Hinzufügung von COMBINING GRAPHEME JOINER hat sich geirrt, als festgestellt wurde, dass "Grapheme Sequenzen aus einem oder mehreren codierten Zeichen sind, die dem entsprechen, was Benutzer als Zeichen betrachten." Es sollte stattdessen lauten: "Eine Folge von einem oder mehreren Graphemen setzt das zusammen, was der Benutzer als Zeichen betrachtet." Dann könnte der Begriff "Graphemsequenz" deutlich vom Begriff "Zeichenfolge" verwendet werden. Beide Begriffe sind nützlich. "Graphemsequenz" impliziert genau den Prozess des Aufbaus eines Charakters aus kleineren Stücken. "Zeichenfolge" bedeutet, was wir alle normalerweise verstehen: "Eine Folge von Dingen, die der Benutzer als Zeichen betrachtet."

Manchmal möchte ein Programmierer wirklich auf der Ebene von Graphemsequenzen arbeiten, daher sollten Mechanismen zur Überprüfung und Bearbeitung dieser Sequenzen verfügbar sein. Im Allgemeinen reicht es jedoch aus, bei der Verarbeitung von Text "Zeichensequenzen" zu bearbeiten (was der Benutzer denkt) als Zeichen) und lassen Sie das System die Details der unteren Ebene verwalten.

In jedem Fall, der bisher in dieser Diskussion behandelt wurde, ist es sauberer, "Graphem" zu verwenden, um auf die unteilbaren Komponenten zu verweisen, und "Zeichen", um auf die zusammengesetzte Entität zu verweisen. Diese Verwendung spiegelt auch die seit langem etablierten Bedeutungen beider Begriffe besser wider.


Ein vorsichtiger -1; Ich denke das ist falsch. Sie implizieren, dass ein Zeichen aus vielen Graphemen bestehen kann, aber immer durch eine einzelne Glyphe dargestellt wird. Ich denke in der Tat ist es umgekehrt. Seiten wie en.wikipedia.org/wiki/N-diaeresis legen nahe, dass die Kombination eines Buchstabens mit einem diakritischen Zeichen (mindestens eines, das seine Bedeutung ändert) ein eindeutiges neues Graphem bildet und dass das diakritische Zeichen kein eigenes Graphem ist. Inzwischen sind Glyphen deutlich zusammensetzbare da ich der Route nicht nur ̬̝t̺̖̗̩h̟̟i̹s̹.̯̖̝̯̟̜̥
Mark Amery

Ich schätze die Antwort, die ich gerade gesehen habe. Ich denke jedoch immer noch, dass Ihre Definition von Graphemen tatsächlich falsch ist oder zumindest im Widerspruch dazu steht, wie Unicode das Wort definiert. Sie lehnen die Idee, dass ein Graphem aus Zeichen besteht, als "alles rückwärts" ab, aber ich habe ein wenig gegraben und unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htm gefunden, das buchstäblich mit der Aussage beginnt. " Grapheme sind Sequenzen von einem oder mehreren codierten Zeichen " .
Mark Amery

Und diese Aussage fährt fort: "... die dem entsprechen, was Benutzer als Zeichen betrachten." Sogar der Begriff " Graphem-Joiner " sowie der Mechanismus hinter dem Begriff veranschaulichen, was ich zu Beginn meiner Antwort angegeben habe: Was der Unicode-Standard als "Zeichen" definiert, ist eigentlich eine Mischung aus Graphemen und Zeichen. Es ist sauberer, Grapheme als "Grapheme" und Zeichen als "Zeichen" zu bezeichnen, als Verzerrungen wie " vorkomponierte Zeichen " und " Graphemcluster " zu erfinden .
Armer Yorick

@PoorYorick Sie behaupten, dass "... ein Zeichen eine einzelne Texteinheit ist, die aus einem oder mehreren Graphemen besteht" und "Grapheme sind die einzelnen kleinen Teile. Charaktere sind weiter entwickelt". Haben Sie eine Referenz, die diese Behauptungen stützt? Weil ich irgendwie bezweifle, dass das Unicode-Konsortium absichtlich beschlossen hat, ihre Namen irgendwie "invertiert" zu definieren.
TS

@PoorYorick Ich habe Ihren Standpunkt verstanden, bevor Sie diese weitere Erklärung hinzugefügt haben, deshalb habe ich nicht gefragt. Ich habe einfach nach Referenzen gefragt (Lexikon, wissenschaftliche Artikel, technischer Standard, ...), weil ich kein Dokument kannte, das Graphem so verwendet, wie Sie es interpretieren. (Die ersten Google-Ergebnisse für Grapheme verwenden das Wort auch nicht in Ihrer Art). Sie haben ein Blockzitat hinzugefügt: "Ein Graphem ist ein Codepunkt oder ein Zeichen. [...]" - aber woher kommt es? Am Ende sagen Sie "alteingesessene Bedeutungen beider Begriffe". - Wenn es eingerichtet ist, dann verlinken Sie es mit etwas, das den Begriff auf diese Weise verwendet.
TS
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.