Как определяется, какой символ шрифта отображается при использовании определенной кодировки?

Как определяется, какой символ шрифта отображается при использовании определенной кодировки?

Я пытаюсь понять всю историю того, как текст попадает на экраны. Для простоты я придерживаюсь однобайтовых кодировок (без Unicode).

На моем диске есть последовательность байтов, каждый из которых имеет значение от 0 до 255. Затем я могу указать своим компьютерным программам, какую кодировку символов они должны использовать для отображения этих байтов. Я мог бы использовать ISO-8859-1, где, например, байт со значением 0xA4 — это некий круг с точками (¤). Или я мог бы переключиться на ISO-8859-15, тогда мой байт со значением 0xA4 будет определен как символ евро (€).

Это все еще просто для понимания. Но параллельно с изменением кодировки символов я также могу изменить шрифт, чтобы определить точную форму символа. Теперь шрифт должен работать свсекодировки символов. Итак, шрифт должен иметь оба символа: ¤ и €.

Итак, шаги для вывода текста на экран очевидны:

  1. Последовательное чтение последовательности байтов
  2. Использовать числовое значение текущего байта для поиска в таблице кодировок символов.
  3. Используйте [something] для поиска в файле шрифта, чтобы получить точную форму символа, найденного на шаге 2.
  4. Нарисуйте символ, как определено в файле шрифта

На шаге 3, что это за "что-то", что используется для сопоставления кодировки символов со шрифтом? Зависят ли файлы шрифтов от кодировки символов? Так есть ли у шрифта некий встроенный механизм "двойного переключения", который работает как (псевдокод)

get_symbol(code, encoding) {
  switch code{
    case 0xA4: switch(encoding) {
      case 'ISO-8859-1' : return '¤';
      case 'ISO-8859-15': return '€';
    }
  }
}

?

Каковы подробности того, как из заданной последовательности байтов и заданной кодировки символов получить фактический символ из шрифта? Как это отображается, чтобы всегда давать правильный символ?

решение1

Файлы шрифтов предназначены для отображения определенной кодировки. Программа, использующая заданный шрифт, должна предполагать, что значение nв заданной кодировке отображается путем рендеринга соответствующего номера глифа n.

Файлы шрифтов не обязательно должны иметь глифы для всех возможных значений заданной кодировки символов (для Unicode редко бывает, чтобы шрифт охватывал весь диапазон), и не обязательно должны начинаться с первого значения кодировки (обычно управляющие символы опускаются). Существуют различные схемы форматов файлов для указания начальной точки, конечной точки и опущенных глифов, которые используются для поддержания управляемости размеров файлов шрифтов.

Из приведенного примера, OP, скорее всего, использует систему X Window. Используется более одного формата файла, с соответствующими различными способами доступа к ним. Основные из них:XLFD(старше) иfontconfig(новее). В других системах (Microsoft Windows) используются другие API (LOGFONTструктура — хорошая отправная точка). OSX — еще один пример, имеющий собственный API (CoreText).

Они, конечно, предназначены для графических интерфейсов. Шрифты применяются более широко. Например, Linux и BSD позволяют указывать различные консольные шрифты — которые в дополнение к кодировке накладывают ограничения на количество используемых глифов. Вот несколько полезных ссылок для них:

решение2

Приложение, рисующее текст, указывает шрифт в используемых им API рисования текста, или, если он не указан, используется системный шрифт по умолчанию.

Системы рисования текста на основе Unicode часто имеют алгоритм подстановки шрифта для поиска шрифта, содержащего определенный глиф, если указанный шрифт не имеет запрошенного глифа. Но системы до Unicode обычно просто не могут нарисовать глиф или рисуют глиф «отсутствующий глиф». Даже системы на основе Unicode иногда рисуют символ «отсутствующий глиф».

Связанный контент