¿Cómo se determina qué símbolo de una fuente se muestra cuando se usa una codificación de caracteres específica?

0

Estoy tratando de entender la historia completa de cómo el texto llega a las pantallas. Para mantener las cosas simples, me quedo con codificaciones de un solo byte (sin Unicode).

En mi disco hay una secuencia de bytes, cada uno con un valor entre 0 y 255. Luego puedo decirle a mis programas de computadora qué codificación de caracteres deben usar para mostrar estos bytes. Podría usar ISO-8859-1 donde, por ejemplo, el byte con valor 0xA4 es un círculo con puntos (¤). O podría cambiar a ISO-8859-15, luego mi byte con valor 0xA4 se define como el símbolo del euro (€).

Todo esto es aún simple de entender. Pero paralelamente a cambiar la codificación de caracteres, también puedo cambiar la fuente para definir la forma exacta de un símbolo. Ahora, una fuente debe funcionar con todas las codificaciones de caracteres. Entonces, una fuente debe tener ambos símbolos: ¤ y €.

Entonces, los pasos para obtener un texto en mi pantalla son obviamente:

  1. Leer secuencia de bytes en serie
  2. Use el valor numérico del byte actual para buscar en la tabla de codificación de caracteres
  3. Use [algo] para buscar en el archivo de fuente para obtener la forma exacta del símbolo que se encuentra en el paso 2
  4. Dibuje el símbolo como se define en el archivo de fuente

En el paso 3, ¿qué es este "algo" que se utiliza para asignar la codificación de caracteres a la fuente? ¿Los archivos de fuentes dependen de la codificación de caracteres? Entonces, ¿una fuente tiene algún mecanismo de "doble interruptor" incorporado 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 '€';
    }
  }
}

?

¿Cuáles son los detalles de cómo obtener de una secuencia de bytes dada y una codificación de caracteres dada al símbolo real de la fuente? ¿Cómo se asigna esto para dar siempre el símbolo correcto?

Foo Bar
fuente

Respuestas:

2

Los archivos de fuentes están diseñados para mostrar una codificación particular. El programa que usa una fuente dada tiene que suponer que nse muestra un valor en una codificación dada al representar el número de glifo correspondiente n.

Los archivos de fuentes no necesitan tener glifos para todos los valores posibles de una codificación de caracteres dada (para Unicode es raro que una fuente cubra todo el rango), ni necesitan comenzar con el primer valor de la codificación (generalmente se omiten los caracteres de control) . Existen diferentes esquemas de formato de archivo para especificar el punto de inicio, el punto final y los glifos omitidos que se utilizan para mantener manejables los tamaños de archivo de fuente.

Del ejemplo dado, el OP probablemente esté usando el sistema X Window. Se utiliza más de un formato de archivo, con las diferentes formas correspondientes a las que se accede. Los principales son XLFD (más antiguo) y fontconfig (más nuevo). Con otros sistemas (Microsoft Windows), se utilizan otras API (la LOGFONTestructura es un buen punto de partida). OSX es otro ejemplo, con su propia API ( CoreText ).

Esos, por supuesto, son para interfaces gráficas. Las fuentes son más ampliamente aplicables que eso. Por ejemplo, Linux y los BSD permiten especificar diferentes fuentes de consola, lo que además de la codificación, tiene limitaciones en la cantidad de glifos que se pueden usar. Aquí hay algunos enlaces útiles para aquellos:

Thomas Dickey
fuente
0

La aplicación que dibuja el texto especifica una fuente en las API de dibujo de texto que está usando, o si no especifica, se usa una fuente predeterminada del sistema.

Los sistemas de dibujo de texto basados ​​en Unicode a menudo tienen un algoritmo de sustitución de fuentes para encontrar una fuente que contenga un determinado glifo si la fuente especificada no tiene el glifo solicitado. Pero los sistemas pre-Unicode generalmente simplemente no pueden dibujar un glifo o dibujar un glifo de "glifo faltante". Incluso los sistemas basados ​​en Unicode a veces dibujan un símbolo de "glifo faltante".

Spiff
fuente