Qual é a diferença entre um caractere, um ponto de código, um glifo e um grafema?

146

Tentar entender as sutilezas do Unicode moderno está fazendo minha cabeça doer. Em particular, a distinção entre pontos de código, caracteres, glifos e grafemas - conceitos que, no caso mais simples , quando se lida com texto em inglês usando caracteres ASCII, todos têm uma relação um com o outro - está me causando problemas.

Vendo como esses termos são usados ​​em documentos como o JavaScript de Matthias Bynens tem um problema unicode ou a peça da Wikipedia sobre a unificação Han , concluí que esses conceitos não são a mesma coisa e que é perigoso confundi-los, mas eu sou meio que lutando para entender o que cada termo significa .

O Unicode Consortium oferece um glossário para explicar essas coisas, mas está cheio de "definições" como esta:

Caráter abstrato . Uma unidade de informação usada para a organização, controle ou representação de dados textuais. ...

...

Personagem . ... (2) Sinônimo de caráter abstrato. (3) A unidade básica de codificação para a codificação de caracteres Unicode. ...

...

Glifo . (1) Uma forma abstrata que representa uma ou mais imagens de glifo. (2) Um sinônimo para imagem de glifo. Na exibição de dados de caracteres Unicode, um ou mais glifos podem ser selecionados para representar um caractere específico.

...

Grafema . (1) Uma unidade de escrita minimamente distinta no contexto de um sistema de escrita específico. ...

A maioria dessas definições possui a qualidade de soar muito acadêmica e formal, mas não tem a qualidade de significar nada , ou adia o problema da definição para outra entrada ou seção do glossário do padrão.

Portanto, busco a sabedoria misteriosa daqueles que são mais instruídos que eu. Como exatamente esses conceitos diferem um do outro e em que circunstâncias eles não teriam um relacionamento um com o outro?

Mark Amery
fonte
Existem muitos sistemas de escrita muito diferentes, para muitos idiomas diferentes. Portanto, existem pontos de vista diferentes sobre o problema da escrita e também há uma longa história por trás disso. IMHO é útil ter isso em mente, porque o Unicode tenta cobrir tudo . (Is cursiva iguais ou diferentes caráter radicais Kanji Hangul Diacritics cor de pele emoji ?? ...????)
Pablo H

Respostas:

225
  • Caráter é um termo sobrecarregado que pode significar muitas coisas.

  • Um ponto de código é a unidade atômica da informação. O texto é uma sequência de pontos de código. Cada ponto de código é um número cujo significado é dado pelo padrão Unicode.

  • Uma unidade de código é a unidade de armazenamento de uma parte de um ponto de código codificado. Em UTF-8, isso significa 8 bits, em UTF-16, significa 16 bits. Uma única unidade de código pode representar um ponto de código completo ou parte de um ponto de código. Por exemplo, o glifo do boneco de neve ( ) é um ponto de código único, mas 3 unidades de código UTF-8 e 1 unidade de código UTF-16.

  • Um grafema é uma sequência de um ou mais pontos de código que são exibidos como uma única unidade gráfica que um leitor reconhece como um único elemento do sistema de escrita. Por exemplo, ambos ae äsão grafemas, mas eles podem consistir em vários pontos de código (por exemplo, äpodem ser dois pontos de código, um para o caractere base aseguido por um para a diarese; mas também há um ponto de código alternativo, legado e único que representa esse grafema ) Alguns pontos de código nunca fazem parte de nenhum grafema (por exemplo, não marceneiro de largura zero ou substituições direcionais).

  • Um glifo é uma imagem, geralmente armazenada em uma fonte (que é uma coleção de glifos), usada para representar grafemas ou partes dela. As fontes podem compor vários glifos em uma única representação; por exemplo, se o acima äé um único ponto de código, uma fonte pode optar por renderizá-lo como dois glifos separados, sobrepostos espacialmente. Para OTF, as tabelas GSUB e GPOS da fonte contêm informações de substituição e posicionamento para fazer isso funcionar. Uma fonte também pode conter vários glifos alternativos para o mesmo grafema.

Kerrek SB
fonte
4
Acabei de enviar uma edição que reorganizou a ordem do ponto de código e da unidade de código. Concordo com você que a unidade de código deve ficar em segundo lugar. Quanto a estar "fora do lugar", suspeito que você veja esta resposta como tendo um propósito diferente do que eu. Eu acho que há um grande valor em ter todos esses 5 termos em um só lugar. A última coisa que quero é pesquisar no Google "qual é a diferença entre glifo, grafema, unidade de código e ponto de código e tenho que obter a resposta em dois lugares. Em muitas discussões, esses termos são todos usados ​​na discussão, raramente Eu vejo uma discussão com o outro código-unidade 4, mas não.
Miquéias Zoltu
1
Então, por exemplo '\ uD83D \ uDC0A' (que mostra um emoji de crocodilo), quais são os pontos de código, grafemas etc.? Em particular, como ele se relaciona com .length, .codePointAt(0), .codePointAt(1), .charCodeAt(0)e .charCodeAt(1)resultados?
Qbolec # 11/17
3
@qbolec: Essas são duas unidades de código UTF-16 que expressam um único ponto de código (U + 1F40A) e, como é um emoji, presumivelmente é seu próprio grafema.
11337 Kerrek SB
2
@ TomPažourek: Na canonização decomposta, é representada por dois pontos de código ( amais "combinando diacrítico"); na canonização composta, é representada por um único ponto de código ( äda antiga faixa Latin-1 herdada). A canonização Unicode é o assunto que você deseja investigar se isso lhe interessa. Em um mundo em branco, haveria apenas caracteres base e combinados e nenhum compósito pré-construído.
Kerrek SB
1
@ Kaushik: Não tenho certeza do que você quer dizer: uma unidade de código é uma unidade de armazenamento, sim, mas um ponto de código em geral requer várias unidades de código para armazenamento (exceto em UTF-32).
Kerrek SB 25/09/19
1

Fora do padrão Unicode, um caractere é uma unidade individual de texto composta por um ou mais grafemas . O que o padrão Unicode define como "caracteres" é na verdade uma mistura de grafemas e caracteres. O Unicode fornece regras para a interpretação de grafemas justapostos como caracteres individuais.

Um ponto de código Unicode é um número exclusivo atribuído a cada caractere Unicode (que é um caractere ou um grafema).

Infelizmente, as regras Unicode permitem que alguns grafemas justapostos sejam interpretados como outros grafemas que já possuem seus próprios pontos de código ( formas pré-compostas ). Isso significa que há mais de uma maneira no Unicode para representar um caractere. A normalização Unicode soluciona esse problema.

Um glifo é a representação visual de um personagem. Uma fonte fornece um conjunto de glifos para um determinado conjunto de caracteres (não caracteres Unicode). Para cada personagem, existe um número infinito de possíveis glifos.

Uma resposta a Mark Amery

Primeiro, como afirmei, há um número infinito de possíveis glifos para cada caractere, portanto não, um caractere nem sempre é "representado por um único glifo". O Unicode não se preocupa muito com glifos, e as coisas que define em seus gráficos de código certamente não são glifos. O problema é que nem todos são personagens. Então, o que são eles?

Qual é a entidade maior, o grafema ou o personagem? Como se chama esses elementos gráficos no texto que não são letras ou pontuação? Um termo que vem à mente rapidamente é "grafema". É uma palavra que evoca precisamente a idéia de "uma unidade gráfica em um texto". Ofereço esta definição: Um grafema é o menor componente distinto de um texto escrito .

Pode-se dizer o contrário e dizer que os grafemas são compostos de caracteres, mas então eles seriam chamados de "grafemas chineses", e todos esses pedaços de grafemas chineses são compostos de caracteres. No entanto, isso é tudo ao contrário. Os grafemas são os pequenos pedaços distintos. Os personagens são mais desenvolvidos. A frase "glifos são compostáveis" seria mais bem definida no contexto do Unicode como "caracteres são composíveis".

Unicode define caracteres, mas também define grafemas que devem ser compostos com outros grafemas ou caracteres. Essas monstruosidades que você compôs são um bom exemplo disso. Se eles entenderem, talvez tenham seus próprios pontos de código em uma versão posterior do Unicode;)

Há um elemento recursivo nisso tudo. Em níveis mais altos, grafemas se tornam personagens, mas são grafemas até o fim.

Uma resposta para TS

O capítulo 1 do padrão declara: "A codificação de caracteres Unicode trata os caracteres alfabéticos, ideográficos e símbolos de maneira equivalente, o que significa que eles podem ser usados ​​em qualquer mistura e com a mesma facilidade". Dada essa afirmação, devemos estar preparados para alguma conflilação de termos na norma. Às vezes, a terminologia adequada apenas se torna clara em retrospecto à medida que um padrão se desenvolve.

Muitas vezes acontece nas definições formais de uma linguagem que duas coisas fundamentais são definidas em termos uma da outra. Por exemplo, em XML, um elemento é definido como uma tag inicial, possivelmente seguida pelo conteúdo, seguida por uma tag final. O conteúdo é definido por sua vez como um elemento, dados de caracteres ou algumas outras coisas possíveis. Um padrão de definições autorreferenciais também está implícito no padrão Unicode:

Um grafema é um ponto de código ou um caractere.

Um personagem é composto de uma sequência de um ou mais grafemas.

Quando confrontado pela primeira vez com essas duas definições, o leitor pode se opor à primeira definição, alegando que um ponto de código é um caractere, mas isso nem sempre é verdade. Às vezes, uma sequência de dois pontos de código codifica um único ponto de código sob normalização , e esse ponto de código codificado representa o caractere, conforme ilustrado na figura 2.7 . Sequências de pontos de código que codificam outros pontos de código. Isso está ficando um pouco complicado e nem chegamos à camada em que esquemas de codificação de caracteres como UTF-8 são usados ​​para codificar pontos de código em sequências de bytes.

Em alguns contextos, por exemplo, um artigo acadêmico sobre diacríticos e parte individual de um personagem podem aparecer no texto por si só. Nesse contexto, a parte do caractere individual pode ser considerada um caractere; portanto, faz sentido que o padrão Unicode também permaneça flexível.

Como Mark Avery apontou, um personagem pode ser composto em uma coisa mais complexa. Ou seja, cada personagem pode servir como um grafema, se desejado. O resultado final de toda composição é algo que "o usuário considera como um personagem". Não parece haver nenhuma resistência real, nem no padrão nem nesta discussão, à idéia de que, no nível mais alto, exista no texto essas coisas que o usuário considera como caracteres individuais. Para evitar sobrecarregar esse termo, podemos usar "grafema" em todos os casos em que queremos nos referir às partes usadas para compor um personagem.

Às vezes, o padrão Unicode está em todo lugar com sua terminologia. Por exemplo, o Capítulo 3 define UTF-8 como uma "forma de codificação", enquanto o glossário define "forma de codificação" como outra coisa, e UTF-8 como um "Esquema de codificação de caracteres". Outro exemplo é "Grapheme_Base" e "Grapheme_Extend", que são reconhecidos como erros, mas que persistem porque limpá-los é um pouco de uma tarefa. Ainda há trabalho a ser feito para reforçar a terminologia empregada pelo padrão.

A proposta de adição de COMBINING GRAPHEME JOINER errou ao afirmar que "Grafemas são sequências de um ou mais caracteres codificados que correspondem ao que os usuários consideram caracteres". Em vez disso, deveria ler: "Uma sequência de um ou mais grafemas compõe o que o usuário considera um personagem". Em seguida, poderia usar o termo "sequência de grafema" distintamente do termo "sequência de caracteres". Ambos os termos são úteis. "sequência do grafema" implica ordenadamente o processo de construção de um personagem a partir de pedaços menores. "sequência de caracteres" significa o que todos nós normalmente entendemos que significa: "Uma sequência de coisas que o usuário considera como caracteres".

Às vezes, um programador realmente deseja operar no nível das seqüências de grafema, portanto, mecanismos para inspecionar e manipular essas seqüências devem estar disponíveis, mas geralmente, ao processar o texto, é suficiente operar em "sequências de caracteres" (o que o usuário pensa como um personagem) e deixe o sistema gerenciar os detalhes de nível inferior.

Em todos os casos abordados até agora nesta discussão, é mais fácil usar "grafema" para se referir aos componentes indivisíveis e "caráter" para se referir à entidade composta. Esse uso também reflete melhor os significados estabelecidos há muito tempo de ambos os termos.

Pobre Yorick
fonte
Um -1 cauteloso; Eu acho que isso está errado. Você implica que um personagem pode ser composto de muitos grafemas, mas sempre será representado por um único glifo; Eu acho que de fato é o contrário. Páginas como en.wikipedia.org/wiki/N-diaeresis sugerem que a combinação de uma letra com um diacrítico (pelo menos um que altera seu significado) forma um novo grafema distinto e que o diacrítico não é um grafema por si só. Enquanto isso, os glifos são claramente composíveis.
Mark Amery
Agradeço a resposta, que acabei de ver. No entanto, ainda acho que sua definição de grafema é de fato incorreta, ou pelo menos em desacordo com a forma como o Unicode define a palavra. Você rejeita a idéia de um grafema sendo composto de caracteres como "tudo ao contrário", mas fiz uma pequena escavação e encontrei unicode.org/L2/L2000/00274-N2236-grapheme-joiner.htm que literalmente começa com a declaração " Grafemas são sequências de um ou mais caracteres codificados " .
Mark Amery
E essa afirmação continua: "... isso corresponde ao que os usuários pensam como personagens". Até o termo " marceneiro-grafema ", bem como o mecanismo por trás do termo, são ilustrativos do que afirmei no início da minha resposta: O que o padrão Unicode define como "caracteres" é na verdade uma mistura de grafemas e caracteres. É mais fácil chamar grafemas de "grafemas" e caracteres de "caracteres", em vez de inventar contorções como " caracteres pré-compostos " e " conjuntos de grafemas ".
Poor Yorick
@PoorYorick Você afirma que "... um personagem é uma unidade individual de texto composta por um ou mais grafemas" e "Grafemas são os pequenos pedaços distintos. Os personagens são mais desenvolvidos". Você tem alguma referência que suporte essas reivindicações? Porque, de alguma maneira, duvido que o consórcio Unicode tenha deliberadamente decidido definir seus nomes de alguma forma "invertidos".
TS
@PoorYorick Eu entendi o seu ponto, antes de você adicionar mais uma explicação, não foi por isso que perguntei. Simplesmente pedi referências (léxico, artigos científicos, padrão técnico, ...), porque não conhecia nenhum documento que usasse grafema da maneira que você o interpreta. (Os primeiros resultados do google para grafema também não usam a palavra no seu caminho). Você adicionou uma citação "Um grafema é um ponto de código ou um caractere. [...]" - mas de onde é? No final, você diz "significados estabelecidos há muito tempo de ambos os termos". - Se estiver estabelecido, vincule-se a algo, usando o termo dessa maneira.
TS