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


0

Я намагаюся зрозуміти повну історію того, як текст потрапляє на екрани. Для зручності роботи я залишаюся з однобайтовими кодуваннями (без Unicode).

На моєму диску є послідовність байтів, кожен зі значенням між 0 і 255. Потім я можу сказати своїм комп'ютерним програмам, які кодування символів вони повинні використовувати для відображення цих байтів. Я міг би використовувати ISO-8859-1, де, наприклад, байт зі значенням 0xA4 є деяким колом з для крапок (¤). Або я міг перейти на ISO-8859-15, тоді мій байт зі значенням 0xA4 визначається як символ євро (€).

Це все ще просто зрозуміти. Але паралельно зміні кодування символів, я також можу змінити шрифт, щоб визначити точну форму символу. Тепер шрифт призначений для роботи з усіма кодованими символами. Отже, шрифт повинен мати обидва символи: ¤ та €.

Отже, кроки, щоб отримати текст на моєму екрані, очевидно:

  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 '€';
    }
  }
}

?

Які деталі, як пройти від заданої послідовності байтів та заданого кодування символів до фактичного символу шрифту? Як це відображення завжди дає правильний символ?

Відповіді:


2

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

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

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

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


0

Додаток, який малює текст, визначає шрифт у API-програмах для малювання тексту, який він використовує, або якщо він не вказується, використовується шрифт системи за замовчуванням.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.