Como é determinado qual símbolo de uma fonte é exibido ao usar uma codificação de caractere específica?

0

Estou tentando entender a história completa de como o texto aparece nas telas. Para manter as coisas simples, fico 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 informar 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 é definido como o símbolo do Euro (€).

Tudo isso ainda é simples de entender. Mas, paralelamente à alteração da codificação de caracteres, também posso alterar a fonte para definir a forma exata de um símbolo. Agora, uma fonte serve para trabalhar com as codificações de caracteres all . Então, uma fonte deve ter os dois símbolos: ¤ e €.

Então, os passos para colocar um texto na minha tela são obviamente:

  1. Leia a sequência de bytes em série
  2. Use o valor numérico do byte atual para procurar na tabela de codificação de caracteres
  3. Use [algo] para procurar no arquivo de fonte para obter o formato exato do símbolo encontrado na etapa 2
  4. Desenhe o símbolo como 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 tem algum mecanismo "double switch" embutido 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 obter uma determinada seqüência de bytes e uma determinada codificação de caracteres para o símbolo real da fonte? Como isso é mapeado para sempre dar o símbolo correto?

    
por Foo Bar 24.05.2015 / 16:39

2 respostas

2

Os arquivos de fontes são projetados para mostrar uma codificação específica. O programa que usa uma determinada fonte tem que assumir que um valor n em uma determinada codificação é exibido ao renderizar o número de 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 uma fonte cobrir todo o intervalo), nem precisam começar com o primeiro valor da codificação (normalmente 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.

A partir do exemplo dado, o OP provavelmente está usando o sistema X Window. Há mais de um formato de arquivo usado, com diferentes formas correspondentes que eles são acessados. As principais são XLFD (mais antigas) e < href="http://www.freedesktop.org/wiki/Software/fontconfig/"> fontconfig (mais recente). Com outros sistemas (Microsoft Windows), outras APIs são usadas (o LOGFONT estrutura é um bom ponto de partida). O OSX é outro exemplo, com sua própria API ( CoreText ) .

Esses são, obviamente, para interfaces gráficas. 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 quanto ao número de glifos que podem ser usados. Aqui estão alguns links úteis para aqueles:

por 24.05.2015 / 16:53
0

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 é usada.

Os sistemas de desenho de texto baseados em Unicode geralmente possuem um algoritmo de substituição de fontes 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 não desenham um glifo nem desenham um glifo "glifo ausente". Mesmo os sistemas baseados em Unicode, às vezes, desenham um símbolo de "glifo perdido".

    
por 24.05.2015 / 16:52