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?
quelle
Antworten:
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
a
undä
Grapheme, aber sie können aus mehreren Codepunkten bestehen (z. B.ä
zwei Codepunkte,a
einer 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.quelle
.length
,.codePointAt(0)
,.codePointAt(1)
,.charCodeAt(0)
und.charCodeAt(1)
Ergebnisse?a
plus "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.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:
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.
quelle