Я пытаюсь понять всю историю появления текста на экранах. Для простоты я остаюсь с однобайтовыми кодировками (без Unicode).
На моем диске есть последовательность байтов, каждый со значением от 0 до 255. Затем я могу сообщить своим компьютерным программам, какую кодировку символов следует использовать для отображения этих байтов. Я мог бы использовать ISO-8859-1, где, например, байт со значением 0xA4 - это круг с точками (¤). Или я мог бы переключиться на ISO-8859-15, тогда мой байт со значением 0xA4 определен как символ евро (€).
Это все еще просто понять. Но параллельно с изменением кодировки символов я также могу изменить шрифт, чтобы определить точную форму символа. Теперь шрифт предназначен для работы со всеми кодировками символов. Итак, шрифт должен иметь оба символа: ¤ и €.
Итак, шаги, чтобы получить текст на моем экране, очевидно:
- Читать последовательность байтов последовательно
- Используйте числовое значение текущего байта для поиска в таблице кодировки символов
- Используйте [что-то] для поиска в файле шрифта, чтобы получить точную форму символа, найденного на шаге 2
- Нарисуйте символ как определено в файле шрифта
На шаге 3, что это за «что-то», которое используется для сопоставления кодировки символов со шрифтом? Файлы шрифтов зависят от кодировки символов? Итак, есть ли у шрифта какой-то встроенный механизм "двойного переключения", который работает как (псевдокод)
get_symbol(code, encoding) {
switch code{
case 0xA4: switch(encoding) {
case 'ISO-8859-1' : return '¤';
case 'ISO-8859-15': return '€';
}
}
}
?
Каковы подробности, как получить из заданной последовательности байтов и заданной кодировки символов фактический символ из шрифта? Как это отображается, чтобы всегда давать правильный символ?