В шрифте есть буквы, но они не набираются: проверяем Unicode-карту

Бывает, что в редакторе видны нарисованные глифы, а после экспорта часть символов не вводится, подменяется пустым прямоугольником или показывает соседнюю букву. Часто проблема не в контуре, а в карте соответствий: кодовая точка Unicode должна вести к нужному глифу. Ниже — способ проверить это до передачи файла.
Что связывает набранный символ с рисунком
Шрифтовой файл хранит контуры отдельно от таблицы, которая говорит программе, какой контур показывать для введённого символа. В OpenType такую задачу выполняет таблица cmap: она сопоставляет коды символов с индексами глифов. Если нужного соответствия нет, программа обычно получает .notdef — стандартный глиф отсутствующего символа; если сопоставление ошибочное, она может показать другой рисунок.
Это объясняет важную разницу: «глиф есть в редакторе» не равно «символ доступен пользователю». У глифа может быть внутреннее имя вроде uni0416 или произвольное имя, но для обычного набора нужен корректный Unicode-код. И наоборот, нарисованный знак может оставаться намеренно без кодовой точки: например, быть компонентом или альтернативной формой, вызываемой функцией OpenType.
Спецификация OpenType описывает cmap именно как отображение кодов символов на индексы глифов; официальное описание таблицы опубликовано в документации Microsoft. Это не место, где исправляют форму букв, метрики или название семейства: карта отвечает за адресацию. Поэтому перед правкой полезно определить, какой слой неисправен — сам рисунок, кодовая точка, файл экспорта или программа, в которой выполняется проверка.
Сначала зафиксируйте ожидаемый набор
Не начинайте проверку с хаотичного набора текста. Составьте короткую ведомость символов, которые обещает проект: строчные и прописные буквы, цифры, пробел, базовая пунктуация, а также действительно нужные дополнительные знаки. Для рукописного шрифта это может быть русский алфавит, латиница для имён и адресов, тире, кавычки и знак номера. Не добавляйте длинный универсальный перечень «на всякий случай» — он мешает заметить пропуски в реальном сценарии.
Для каждой ожидаемой позиции запишите три поля: видимый символ, кодовую точку и имя глифа в редакторе. Например, заглавная Ж — это U+0416, а строчная ж — U+0436. Код удобно записывать в шестнадцатеричном виде с префиксом U+; не полагайтесь только на похожий силуэт или клавишу на клавиатуре. У визуально похожих знаков могут быть разные коды и назначения.
Ведомость нужна не ради формальности. Она отделяет вопросы «этот знак должен входить в шрифт?» и «он назначен правильному символу?». Если клиент просил только кириллицу, отсутствие латинского W само по себе не дефект. Но если заявлены оба набора, одинаковый рисунок A и кириллическая А должны быть осознанно представлены по своим кодам — программа не угадывает намерение автора.
Проверьте соответствия до экспорта
Откройте карту символов или таблицу Unicode в редакторе шрифтов. Ищите не только пустые клетки, но и дубли: две ожидаемые кодовые точки могут указывать на один глиф, а один глиф может оказаться назначен не тому символу. Сравните список кодов с ведомостью и проверьте каждое расхождение в обе стороны: есть ли нужный код, и ведёт ли он к ожидаемой форме.
Особенно легко ошибиться в знаках, которые выглядят почти одинаково: дефис-минус U+002D и тире, латинская a и кириллическая а, обычный пробел и неразрывный пробел. Это не означает, что каждому проекту нужны все варианты. Решение должно следовать сценарию использования: например, в редакционном тексте могут понадобиться разные виды тире, а в коротком логотипе достаточно базового набора.
Затем свяжите символы в простые строки, где ошибка заметна. Для русской проверки подойдут пары «Жж, Ёё, Ъъ, Ыы» и текст с кавычками, тире и цифрами. Для смешанной латиницы добавьте пары, которые часто принимают за кириллицу: A-А, C-С, E-Е, P-Р, X-Х. Сравнивайте не только форму, но и ожидаемое содержимое при копировании в редактор текста.
Полезно разделить такую проверку на три прохода. Первый — покрытие: каждый символ из ведомости должен найтись в карте. Второй — соответствие: выбранный код должен показывать именно тот рисунок, который задумали. Третий — ввод: символ можно получить обычным способом в целевой программе, вставить из буфера или ввести по коду, если это предусмотрено системой. Если смешать все проверки, легко принять неудобный способ ввода за отсутствующий глиф или, наоборот, принять похожий контур за правильное соответствие.
Не ограничивайтесь отдельными знаками. Проверьте слова и короткие фразы с комбинациями, которые реально встретятся: фамилия с «ё», название с заглавными буквами, адрес электронной почты, телефон с тире и скобками. Это не заменяет проверку каждой кодовой точки, но показывает, не теряется ли символ среди соседей и не ломает ли ожидаемый ввод обычный рабочий процесс. Результаты отмечайте в ведомости как «есть», «ошибка кода», «нет в экспорте» или «нужно уточнить требования».
Экспортируйте отдельную контрольную сборку
Перед финальным файлом сохраните контрольный экземпляр с заметным номером версии или отдельным именем, чтобы не перепутать его с предыдущей сборкой. Экспортируйте в тот же формат, который планируете передавать, и проверьте, что редактор не переключил настройки кодирования или не выбрал другой файл. Повторное открытие исходного проекта не подтверждает, что экспортированный бинарный файл содержит те же соответствия.
Откройте уже экспортированный файл в независимом просмотрщике шрифтов или в другом экземпляре редактора, который читает сам файл, а не открытый исходный проект. Найдите таблицу символов и проверьте ожидаемые знаки. Если есть возможность просмотреть сведения о таблице cmap, используйте это для диагностики, но не меняйте двоичные таблицы вручную без понимания формата. Исправление лучше внести в исходный проект и повторно экспортировать: так его можно воспроизвести и передать.
Проверьте файл в целевой программе после полной установки или загрузки обновлённой версии. Удалите из теста старую одноимённую сборку, если она может подменить новую, и перезапустите приложение, если оно кэширует шрифты. Эти действия относятся уже к обнаружению правильного файла, а не к исправлению cmap. Если одна программа показывает ожидаемые знаки, а другая — нет, сохраните название приложения, версию файла и контрольную строку: это поможет отделить проблему среды от содержимого шрифта.
Разберите результат по симптомам
Пустой прямоугольник или стандартный знак отсутствующего символа обычно означает, что в установленном файле нет доступного соответствия для введённого символа либо его не поддерживает выбранная версия файла. Сверьте фактический код символа в тестовой строке с ведомостью и проверьте код в экспортированном файле. Не рисуйте новый глиф, пока не подтвердили, что программа запрашивает именно тот знак.
Если вместо одной буквы появляется другая, проверьте ошибочно назначенный или повторно использованный код. Скопируйте символ из тестовой строки в нейтральный редактор и уточните его кодовую точку, затем сравните результат с таблицей шрифта. Особенно часто путаница возникает при смешении кириллицы и латиницы: на экране формы почти совпадают, а адреса у них разные.
Если в редакторе шрифтов всё верно, но тестовый файл ведёт себя иначе, повторите экспорт в новое имя и откройте именно новый файл. Сверьте дату и расположение файла, а затем проверьте его в чистой тестовой строке или другой программе. Несколько похожих версий с одинаковым названием семьи делают диагностику ненадёжной: сначала установите, какой файл реально выбран, и лишь затем ищите ошибку в таблице.
Контрольный пример перед передачей
Представим, что пользователь сообщает: «строчная ё печатается как е». В исходнике проверяют наличие глифа для U+0451 и соответствие именно этому коду; затем экспортируют новый файл и набирают её в тестовой строке. Если строка работает в просмотрщике файла, но в рабочей программе показывает старую форму, проверяют выбранную версию и повторно загружают её в приложении. Если ошибка уже видна в самом файле, возвращаются в исходник, исправляют назначение и повторяют контрольную сборку.
Другой пример — в шрифте нарисована красивая длинная черта, но при наборе клавиатурного дефиса она не появляется. Тут возможны два разных решения. Можно назначить рисунок к дефису-минусу U+002D, если он должен заменять вводимый дефис, или оставить его на коде соответствующего тире и вводить тире отдельно. Важно выбрать поведение заранее: наличие похожей формы в списке глифов не назначает её автоматически на привычную клавишу.
Чек-лист проверки Unicode-карты
- Зафиксируйте заявленный состав набора, не проверяйте случайный длинный алфавит.
- Для каждого нужного знака запишите код
U+…и ожидаемое имя глифа. - Сверьте карту в исходном проекте: пропуски, неверные адреса, случайные дубли.
- Экспортируйте новый файл с ясной версией и откройте именно его.
- Проверьте контрольные строки с кириллицей, латиницей и пунктуацией в целевой программе.
- При проблеме отделите неверный код, отсутствующий глиф, старый файл и ограничение приложения.
- Повторите те же проверки после исправления и передайте короткий список результата.
Частые ошибки
Путать форму с кодом. Два знака могут выглядеть одинаково, но оставаться разными символами для текста. Сверяйте кодовую точку, а не только визуальное сходство.
Объявлять отсутствующий знак дефектом без требований. Не каждая гарнитура обязана включать каждый символ Unicode. Сначала сопоставьте карту с заявленным набором и задачами пользователя.
Проверять только окно редактора. Проект может выглядеть правильно, пока экспорт не сохранён или приложение не открыло новую версию. Тестируйте отдельный экспортированный файл.
Исправлять двоичный файл вручную. Быстрая правка внутренней таблицы легко теряется при следующей сборке. Внесите соответствие в исходный проект и экспортируйте заново.
Не различать код и OpenType-подстановку. Лигатура или альтернативная форма может включаться механизмом подстановки при определённом наборе. Это отдельный слой; сначала проверьте базовый символ, потом — ожидаемое поведение функций шрифта.
Частые вопросы
Что такое карта cmap в файле шрифта?
Это таблица, связывающая коды символов с глифами, которые программа должна показать. Именно поэтому наличие рисунка в проекте ещё не гарантирует, что его можно набрать.
Как посмотреть Unicode-код символа?
Используйте таблицу символов или инспектор Unicode в редакторе текста либо шрифтовом редакторе. Запишите код в форме U+0416 и сверяйте его с картой файла, не ограничиваясь названием на клавише.
Можно ли назначить один рисунок двум похожим буквам?
Технически одна форма может быть связана более чем с одним кодом, но это не всегда полезно: копирование, поиск и смешанные тексты зависят от кодов символов. Сначала решите, должны ли эти знаки быть разными для пользователя, затем проверяйте назначение и лицензированные требования к охвату.
Почему знак есть в редакторе, но не появляется после экспорта?
В исходном проекте может быть рисунок без требуемой кодовой точки, либо тестируется старая сборка. Проверьте таблицу символов в экспортированном файле, имя и расположение файла, а потом повторите тест в целевой программе.
Надо ли добавлять все символы Unicode?
Нет. Набор выбирают по языкам и реальным сценариям: текстам, именам, адресам, интерфейсу или печатным материалам. Полный Unicode — огромный стандарт, и наличие сотен ненужных знаков не заменяет проверку заявленной поддержки.
Что делать, если один редактор показывает знак правильно, а другой нет?
Сначала убедитесь, что оба приложения используют один и тот же новый файл, а не кэшированную или одноимённую старую версию. Если различие повторяется на контрольной строке, зафиксируйте приложение, версию файла и символ вместе с его кодом для дальнейшей диагностики.
Итог
Проверка экспортированного шрифта начинается с небольшой ведомости: нужный символ, его код и соответствующий глиф. Затем сверяют карту cmap в исходнике и в отдельном экспортированном файле, проверяют контрольную строку и только после этого передают результат. Если вы превращаете почерк в файл шрифта, Fontgenerator поможет подготовить основу; после сборки всё равно проверьте заявленный набор в тех приложениях, где им будут пользоваться.