
Estou tentando entender toda a história por trás de como o texto aparece nas telas. Para manter as coisas simples, continuo com codificações de byte único (sem Unicode).
No meu disco há uma sequência de bytes, cada um com um valor entre 0 e 255. Posso então dizer aos meus programas de computador qual codificação de caracteres eles devem usar para exibir esses bytes. Eu poderia usar ISO-8859-1 onde, por exemplo, o byte com valor 0xA4 é algum círculo com pontos (¤). Ou eu poderia mudar para ISO-8859-15, então meu byte com valor 0xA4 será definido como o símbolo do Euro (€).
Tudo isso ainda é simples de entender. Mas paralelamente à alteração da codificação dos caracteres, também posso alterar a fonte para definir a forma exata de um símbolo. Agora, uma fonte deve funcionar comtodoscodificações de caracteres. Portanto, uma fonte deve ter os dois símbolos: ¤ e €.
Então, as etapas para colocar um texto na minha tela são obviamente:
- Ler sequência de bytes em série
- Use o valor numérico do byte atual para pesquisar na tabela de codificação de caracteres
- Use [algo] para pesquisar no arquivo de fonte para obter a forma exata do símbolo encontrado na etapa 2
- Desenhe o símbolo conforme definido no arquivo de fonte
Na etapa 3, o que é esse “algo” usado para mapear a codificação de caracteres para a fonte? Os arquivos de fontes dependem da codificação de caracteres? Então, uma fonte possui algum mecanismo integrado de "troca dupla" que funciona como (pseudocódigo)
get_symbol(code, encoding) {
switch code{
case 0xA4: switch(encoding) {
case 'ISO-8859-1' : return '¤';
case 'ISO-8859-15': return '€';
}
}
}
?
Quais são os detalhes de como passar de uma determinada sequência de bytes e de uma determinada codificação de caracteres para o símbolo real da fonte? Como isso é mapeado para sempre fornecer o símbolo correto?
Responder1
Os arquivos de fontes são projetados para mostrar uma codificação específica. O programa que usa uma determinada fonte deve assumir que um valor n
em uma determinada codificação é exibido renderizando o número do glifo correspondente n
.
Os arquivos de fontes não precisam ter glifos para todos os valores possíveis de uma determinada codificação de caracteres (para Unicode é raro que uma fonte cubra todo o intervalo), nem precisam começar com o primeiro valor da codificação (geralmente os caracteres de controle são omitidos) . Existem diferentes esquemas de formato de arquivo para especificar o ponto inicial, o ponto final e os glifos omitidos que são usados para manter os tamanhos dos arquivos de fonte gerenciáveis.
Pelo exemplo dado, o OP provavelmente está usando o sistema X Window. Há mais de um formato de arquivo usado, com diferentes formas correspondentes de acesso. Os principais sãoXLFD(mais velho) econfiguração de fonte(mais recente). Com outros sistemas (Microsoft Windows), outras APIs são utilizadas (oLOGFONT
estrutura é um bom ponto de partida). OSX é outro exemplo, com API própria (CoreText).
É claro que são para interfaces gráficas. As fontes são mais amplamente aplicáveis do que isso. Por exemplo, o Linux e os BSDs permitem especificar diferentes fontes de console - que, além da codificação, apresentam limitações no número de glifos utilizáveis. Aqui estão alguns links úteis para eles:
Responder2
O aplicativo que desenha o texto especifica uma fonte nas APIs de desenho de texto que está usando ou, se não especificar, uma fonte padrão do sistema será usada.
Os sistemas de desenho de texto baseados em Unicode geralmente possuem um algoritmo de substituição de fonte para encontrar uma fonte que contenha um determinado glifo se a fonte especificada não tiver o glifo solicitado. Mas os sistemas pré-Unicode geralmente simplesmente não conseguem desenhar um glifo ou desenhar um glifo "ausente". Mesmo os sistemas baseados em Unicode às vezes desenham um símbolo de "glifo ausente".