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

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

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

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

Итак, шаги, чтобы получить текст на моем экране, очевидно:

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

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

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

?

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

29
задан Foo Bar
09.04.2023 0:22 Количество просмотров материала 2773
Распечатать страницу

2 ответа

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

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

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

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

2
отвечен Thomas Dickey 2023-04-10 08:10

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

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

0
отвечен Spiff 2023-04-10 10:27

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх