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?
fonte
Respostas:
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
a
eä
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 basea
seguido 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.fonte
.length
,.codePointAt(0)
,.codePointAt(1)
,.charCodeAt(0)
e.charCodeAt(1)
resultados?a
mais "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.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:
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.
fonte