Skip to content

Ассемблер

Пример нестандартной задачи, где проблему пришлось решать не на уровне HTML, CSS или JavaScript, а через ручное изменение нескольких байт в файле шрифта.

Задача

Исправить некорректное отображение нового шрифта в браузерах на Linux.

Проблема

После внедрения нового дизайна выяснилось, что на Linux в браузерах кириллица отображается некорректно: символы имели неправильные отступы и визуально "разъезжались".

При этом:

  • на Windows шрифт отображался нормально;
  • проблема воспроизводилась именно на кириллице;
  • вёрстка, JavaScript и CSS работали корректно.

Диагностика

После проверки стало понятно, что источник проблемы находится не в коде интерфейса, а в самом файле шрифта.

Дальше исследовал шрифт через специализированный инструмент для просмотра метрик. В одной из метрик обнаружилось подозрительно большое отрицательное значение. Для сравнения у других корректных шрифтов эта же метрика обычно была равна 0.

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

Решение

Исправление было сделано вручную:

  • определил нужное смещение в файле шрифта;
  • открыл файл на уровне байтов;
  • изменил несколько байт по указанному адресу;
  • выставил для проблемной метрики нулевое значение.

Фактически задача свелась к точечному ручному исправлению бинарных данных шрифта.

Результат

После правки шрифт стал корректно отображаться:

  • в браузерах на Linux;
  • на кириллице;
  • без регрессии на других ОС.

Это позволило сохранить новый шрифт в дизайне и не откатываться на замену, которая могла бы повлиять на внешний вид интерфейса.

Причина проблемы

Причина оказалась в самом шрифте: при его адаптации под кириллицу издатель некорректно выставил одну из метрик.

Сайт обновлен и проверен: