Qual è la differenza tra un carattere, un punto di codice, un glifo e un grafema?


146

Cercare di capire le sottigliezze del moderno Unicode mi sta facendo male alla testa. In particolare, la distinzione tra punti di codice, caratteri, glifi e grafemi - concetti che nel caso più semplice , quando si tratta di testo inglese usando caratteri ASCII, hanno tutti un rapporto uno a uno tra loro - mi sta causando problemi.

Vedendo come questi termini vengono utilizzati in documenti come JavaScript di Matthias Bynens ha un problema unicode o il pezzo di Wikipedia sull'unificazione Han , ho capito che questi concetti non sono la stessa cosa e che è pericoloso confonderli, ma sono un po ' lottando per capire cosa significa ogni termine .

Il consorzio Unicode offre un glossario per spiegare queste cose, ma è pieno di "definizioni" come questa:

Carattere astratto . Un'unità di informazioni utilizzata per l'organizzazione, il controllo o la rappresentazione di dati testuali. ...

...

Carattere . ... (2) Sinonimo di carattere astratto. (3) L'unità base di codifica per la codifica dei caratteri Unicode. ...

...

Glyph . (1) Una forma astratta che rappresenta una o più immagini di glifi. (2) Un sinonimo di immagine di glifo. Nella visualizzazione dei dati dei caratteri Unicode, è possibile selezionare uno o più glifi per rappresentare un determinato carattere.

...

Grapheme . (1) Un'unità di scrittura minimamente distintiva nel contesto di un particolare sistema di scrittura. ...

La maggior parte di queste definizioni possiede la qualità del suono molto accademico e formale, ma non ha la qualità del significato , oppure rimanda il problema della definizione a un altro glossario o sezione dello standard.

Quindi cerco l'arcana saggezza di coloro che sono più dotti di me. In che modo esattamente ciascuno di questi concetti differisce l'uno dall'altro e in quali circostanze non avrebbero una relazione uno a uno?


Esistono molti sistemi di scrittura molto diversi, per molte lingue diverse. Quindi ci sono diverse opinioni sul problema della scrittura, e c'è anche una lunga storia dietro di esso. IMHO è utile tenerlo a mente, perché Unicode cerca di coprire tutto . (Il carattere corsivo è lo stesso o diverso? Radicali Kanji? Hangul? Diacritici? Emoji color pelle ?? ...)
Pablo H

Risposte:


225
  • Personaggio è un termine sovraccarico che può significare molte cose.

  • Un punto di codice è l'unità atomica di informazioni. Il testo è una sequenza di punti di codice. Ogni punto di codice è un numero a cui viene dato significato dallo standard Unicode.

  • Un'unità di codice è l'unità di memorizzazione di una parte di un punto di codice codificato. In UTF-8 questo significa 8 bit, in UTF-16 questo significa 16 bit. Una singola unità di codice può rappresentare un punto di codice completo o parte di un punto di codice. Ad esempio, il glifo pupazzo di neve ( ) è un singolo punto di codice ma 3 unità di codice UTF-8 e 1 unità di codice UTF-16.

  • Un grafema è una sequenza di uno o più punti di codice che vengono visualizzati come una singola unità grafica che un lettore riconosce come singolo elemento del sistema di scrittura. Ad esempio, entrambi ae äsono grafemi, ma possono essere costituiti da più punti di codice (ad esempio äpossono essere due punti di codice, uno per il carattere di base aseguito da uno per la diaresi; ma esiste anche un punto di codice unico alternativo, legacy, che rappresenta questo grafema ). Alcuni punti di codice non fanno mai parte di alcun grafema (ad esempio il non-joiner a larghezza zero o le sostituzioni direzionali).

  • Un glifo è un'immagine, generalmente memorizzata in un carattere (che è una raccolta di glifi), utilizzata per rappresentare grafemi o parti di essi. I caratteri possono comporre più glifi in un'unica rappresentazione, ad esempio, se quanto sopra äè un singolo punto di codice, un carattere può scegliere di renderlo come due glifi separati, sovrapposti spazialmente. Per OTF, le tabelle GSUB e GPOS del font contengono informazioni sulla sostituzione e sul posizionamento per farlo funzionare. Un font può contenere anche più glifi alternativi per lo stesso grafema.


4
Ho appena inviato una modifica che ha riordinato l'ordine di code-point e code-unit. Sono d'accordo con te sul fatto che l'unità di codice dovrebbe venire seconda. Per quanto riguarda l'essere "fuori posto", sospetto che tu veda questa risposta come uno scopo diverso da me. Penso che abbia un grande valore avere tutti e 5 questi termini in un unico posto. L'ultima cosa che voglio è cercare su Google "qual è la differenza tra glifo, grafema, unità di codice e punto di codice e devo ottenere la risposta in due punti. In molte discussioni questi termini sono tutti usati nella discussione, raramente lo fanno Vedo una discussione con gli altri 4 ma non con l'unità di codice.
Micah Zoltu,

1
Ad esempio, "\ uD83D \ uDC0A" (che mostra un'emoji di coccodrillo) quali sono i punti di codice, i grafici, ecc? In particolare, come si relaziona a .length, .codePointAt(0), .codePointAt(1), .charCodeAt(0)e .charCodeAt(1)risultati?
qbolec,

3
@qbolec: Quelle sono due unità di codice UTF-16 che esprimono un singolo punto di codice (U + 1F40A), e dato che si tratta di un'emoji, è presumibilmente il suo singolo grafo.
Kerrek SB,

2
@ TomPažourek: nella canonicalizzazione decomposta, è rappresentato da due punti di codice ( apiù "combinazione diacritica"); nella canonicalizzazione composta è rappresentato da un singolo punto di codice ( ädal vecchio intervallo latino-1). La canonicalizzazione Unicode è l'oggetto su cui vuoi indagare se questo ti interessa. In un mondo in ardesia, ci sarebbe solo base e combinazione di personaggi e nessun composto precompilato.
Kerrek SB,

1
@ Kaushik: Non sono sicuro di cosa intendi: un'unità di codice è un'unità di archiviazione, sì, ma un punto di codice in generale richiede più unità di codice per l'archiviazione (tranne in UTF-32).
Kerrek SB,

1

Al di fuori dello standard Unicode, un personaggio è una singola unità di testo composta da uno o più grafemi . Ciò che lo standard Unicode definisce "caratteri" è in realtà un mix di grafemi e personaggi. Unicode fornisce regole per l'interpretazione dei grafemi giustapposti come singoli personaggi.

Un punto di codice Unicode è un numero univoco assegnato a ciascun carattere Unicode (che è un carattere o un grafema).

Sfortunatamente, le regole Unicode consentono ad alcuni grafemi giustapposti di essere interpretati come altri grafemi che hanno già i loro punti di codice ( forme precomposte ). Ciò significa che in Unicode esiste più di un modo per rappresentare un personaggio. La normalizzazione Unicode risolve questo problema.

Un glifo è la rappresentazione visiva di un personaggio. Un font fornisce un set di glifi per un determinato set di caratteri (non caratteri Unicode). Per ogni personaggio esiste un numero infinito di glifi possibili.

Una risposta a Mark Amery

Innanzitutto, come ho affermato, esiste un numero infinito di glifi possibili per ciascun personaggio, quindi no, un personaggio non è "sempre rappresentato da un singolo glifo". Unicode non si preoccupa molto dei glifi e le cose che definisce nei suoi diagrammi di codice non sono certamente glifi. Il problema è che non sono nemmeno tutti personaggi. Allora cosa sono?

Qual è l'entità maggiore, il grafema o il personaggio? Come si chiamano quegli elementi grafici nel testo che non sono lettere o punteggiatura? Un termine che viene subito in mente è "grafema". È una parola che evoca precisamente l'idea di "un'unità grafica in un testo". Offro questa definizione: un grafema è il più piccolo componente distinto in un testo scritto .

Si potrebbe andare dall'altra parte e dire che i grafemi sono composti da personaggi, ma poi sarebbero chiamati "grafemi cinesi", e tutti quei frammenti di cui sono composti i grafemi cinesi dovrebbero invece essere chiamati "personaggi". Tuttavia, è tutto indietro. Graphemes sono i piccoli pezzi distinti. I personaggi sono più sviluppati. La frase "glifi sono compostabili", sarebbe meglio dichiarata nel contesto di Unicode come "i caratteri sono compostabili".

Unicode definisce i caratteri ma definisce anche i grafemi che devono essere composti con altri grafemi o personaggi. Quelle mostruosità che hai composto ne sono un ottimo esempio. Se riescono a prendere forse otterranno i loro punti di codice in una versione successiva di Unicode;)

C'è un elemento ricorsivo in tutto questo. Ai livelli più alti, i graphhemes diventano personaggi, diventano graphhemes, ma sono graphhemes fino in fondo.

Una risposta a TS

Il capitolo 1 dello standard afferma: "La codifica del carattere Unicode tratta i caratteri alfabetici, i caratteri ideografici e i simboli in modo equivalente, il che significa che possono essere utilizzati in qualsiasi combinazione e con la stessa facilità". Data questa affermazione, dovremmo essere preparati per una certa conflazione dei termini nello standard. A volte la terminologia corretta diventa chiara solo a posteriori man mano che si sviluppa uno standard.

Accade spesso nelle definizioni formali di un linguaggio che due cose fondamentali siano definite l'una nell'altra. Ad esempio, in XML un elemento è definito come un tag iniziale eventualmente seguito dal contenuto, seguito da un tag finale. Il contenuto è a sua volta definito come un elemento, i dati del personaggio o poche altre cose possibili. Un modello di definizioni autoreferenziali è anche implicito nello standard Unicode:

Un grafema è un punto di codice o un carattere.

Un personaggio è composto da una sequenza di uno o più grafemi.

Quando si confronta per la prima volta con queste due definizioni, il lettore potrebbe obiettare alla prima definizione sulla base del fatto che un punto di codice è un carattere, ma ciò non è sempre vero. Una sequenza di due punti di codice a volte codifica un singolo punto di codice in fase di normalizzazione e quel punto di codice codificato rappresenta il carattere, come illustrato nella figura 2.7 . Sequenze di punti di codice che codificano altri punti di codice. Questo sta diventando un po 'complicato e non abbiamo nemmeno raggiunto il livello in cui vengono utilizzati schemi di codifica dei caratteri come UTF-8 per codificare punti di codice in sequenze di byte.

In alcuni contesti, ad esempio un articolo accademico sui segni diacritici , e la parte individuale di un personaggio potrebbe apparire da sola nel testo. In quel contesto, la parte del singolo personaggio potrebbe essere considerata un personaggio, quindi ha senso che anche lo standard Unicode rimanga flessibile.

Come ha sottolineato Mark Avery, un personaggio può essere composto in una cosa più complessa. Cioè, ogni personaggio può servire da grafema se lo si desidera. Il risultato finale di tutta la composizione è una cosa che "l'utente pensa come un personaggio". Non sembra esserci alcuna reale resistenza, né nello standard né in questa discussione, all'idea che al livello più alto ci siano queste cose nel testo che l'utente considera come singoli personaggi. Per evitare di sovraccaricare quel termine, possiamo usare "grapheme" in tutti i casi in cui vogliamo fare riferimento a parti usate per comporre un personaggio.

A volte lo standard Unicode è ovunque con la sua terminologia. Ad esempio, il capitolo 3 definisce UTF-8 come una "forma di codifica" mentre il glossario definisce "forma di codifica" come qualcos'altro e UTF-8 come "schema di codifica dei caratteri". Un altro esempio è "Grapheme_Base" e "Grapheme_Extend", che sono riconosciuti come errori ma che persistono perché eliminarli è un po 'un compito. C'è ancora del lavoro da fare per rafforzare la terminologia utilizzata dalla norma.

La proposta di aggiunta di COMBINING GRAPHEME JOINER ha sbagliato quando affermava che "Graphemes sono sequenze di uno o più caratteri codificati che corrispondono a ciò che gli utenti considerano personaggi". Dovrebbe invece leggere "Una sequenza di uno o più grafemi compone ciò che l'utente pensa come un personaggio". Quindi potrebbe usare il termine "sequenza di grafismi" in modo distinto dal termine "sequenza di caratteri". Entrambi i termini sono utili. La "sequenza dei grafi" implica chiaramente il processo di costruzione di un personaggio da pezzi più piccoli. "sequenza di caratteri" indica ciò che tutti generalmente intuiamo che significhi: "Una sequenza di cose che l'utente pensa come personaggi".

A volte un programmatore vuole davvero operare a livello di sequenze grafiche, quindi dovrebbero essere disponibili meccanismi per ispezionare e manipolare quelle sequenze, ma generalmente, durante l'elaborazione del testo, è sufficiente operare su "sequenze di caratteri" (ciò che l'utente pensa di come personaggio) e lasciare che il sistema gestisca i dettagli di livello inferiore.

In ogni caso trattato finora in questa discussione, è più pulito usare "grapheme" per riferirsi alle componenti indivisibili e "carattere" per riferirsi all'entità composta. Questo utilizzo riflette anche meglio i significati consolidati di entrambi i termini.


Un cauto -1; Penso che sia sbagliato. Implichi che un personaggio può essere composto da molti grafemi, ma sarà sempre rappresentato da un singolo glifo; Penso in effetti sia il contrario. Pagine come en.wikipedia.org/wiki/N-diaeresis suggeriscono che la combinazione di una lettera con un diacritico (almeno uno che cambia il suo significato) forma un nuovo grafema distinto e che il diacritico non è un grafo in sé. Nel frattempo, i glifi sono chiaramente componibili s͈̘̻̗̝i̙̳̩̯̮̥ͅn̪̭̹̝c̪̣̗̞̜e̥̖̮̫̣̯ͅ ̯ͅI̪͉̜̼̼̣̟̣ ̰̟̥̞̹c͈͔͇̼a̙̹̼̦̲̞n̙̺̳̟ͅ ̤̗d̘̭̙̪̦o̬̲̜̺ ̲̬̝t̺̖̗̩̱h̟̟̱i̹s̹̱.̯̖̝̯̟̜̥
Mark Amery,

Apprezzo la risposta, che ho appena visto. Tuttavia, penso ancora che la tua definizione di grafemi sia in realtà errata, o almeno in contrasto con il modo in cui Unicode definisce la parola. Respingi l'idea di un grapheme composto da personaggi come "tutto indietro", ma ho fatto un po 'di ricerche e ho trovato unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htm che inizia letteralmente con l'affermazione " I grafemi sono sequenze di uno o più caratteri codificati " .
Mark Amery,

E questa affermazione continua, "... che corrisponde a ciò che gli utenti pensano come personaggi". Anche il termine " grapheme-joiner ", così come il meccanismo alla base del termine, è illustrativo di ciò che ho affermato all'inizio della mia risposta: ciò che lo standard Unicode definisce come "personaggi" è in realtà un mix di grafemi e personaggi. È più pulito chiamare i graphemes "graphemes" e i personaggi "personaggi" piuttosto che inventare contorsioni come " caratteri precomposti " e " grappoli ".
Povero Yorick,

@PoorYorick Sostieni che "... un personaggio è una singola unità di testo composta da uno o più grafemi" e "Graphemes sono i piccoli pezzi distinti. I personaggi sono più sviluppati". Hai qualche riferimento a supporto di queste affermazioni? Perché in qualche modo dubito che il consorzio Unicode abbia deliberatamente deciso di definire i loro nomi in qualche modo "invertiti".
TS

@PoorYorick Ho capito il tuo punto, prima di aggiungere questa ulteriore spiegazione, non è per questo che ho chiesto. Ho semplicemente chiesto riferimenti (lessico, articoli scientifici, standard tecnici, ...), perché non conoscevo alcun documento, che utilizza il grafema nel modo in cui lo interpreti. (Anche i primi risultati di Google per grapheme non usano la parola sulla tua strada). Hai aggiunto una frase "Un grafema è un punto di codice o un carattere. [...]" - ma da dove viene? Alla fine dici "significati consolidati di entrambi i termini". - Se è stabilito, collega a qualcosa, che sta usando il termine in questo modo.
TS
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.