О кириллических шрифтах TrueType: квадратики, кракозябры и просто пустое место
Проблема старая, сейчас мало актуальная, но в телеграфном стиле подытожим, что мы имеем, т.к. вопросы по этой теме на форумах до сих пор встречаются.
Основные важные сайты: Казарновский, Шрифты и Microsoft Windows.
Существуют две кодовые таблицы CP1252 (WesternEurope) и CP1251 (Cyrillic).
В 1252 входят юникод диапазоны BasicLatin (простая латиница) и Latin-1 (диакритика для фр., нем. и т.д.). В 1251 входят юникод диапазоны BasicLatin и Cyrillic.
Юникодные приложения будут выбирать символы по юникод номеру, тут проблем немного.
С неюникод приложениями дело сложнее. В общем случае они будут обращаться только к символам CP1252 (WesternEurope). Все сказанное не зависит от версии Windows!
Если кириллица в шрифте сидит на месте расширенной латинице (CP1252), то в неюникодных программах все будет замечательно, но юникодные программы будут буксовать: при вводе с кириллической раскладкой они будут искать в шрифте символы с юникод номерами Cyrillic (CP1251) и не находить их.
Если же кириллица сидит на законной CP1251, то ее наоборот не найдут неюникодные программы.
Есть несколько способов, как обмануть всех и поиметь кириллицу и там, и там.
1. Продублировать кириллицу в нижней части 1252 (WE) и 1251 (Cyr). Так поступает, например, ParaType в своих шрифтах с суффиксом имени CTT. Тут будут некоторые напряги с символом Евро и сербской буквой Ђ — скажем еще раз спасибо Юникодной комиссии за наше счастливое детство без их опеки и без их евро.
2. Сделать шрифт содержащий только CP1251 (Cyr), а потом разложить его в реестре (w2k/XP) или в win.ini (Win9x) на [имя_шрифта] Cyr, так же как мы раскладываем Times New Roman на Times New Roman Cyr, Times New Roman CE и т.д. Сделать это можно программой WGL Assistance (и подобными). Чтобы WGL Assistance увидел этот шрифт как Cyr, при генерации его в FontLab надо поставить Supported CodePages: 1252 и 1251.
3. Сделать шрифт содержащий только CP1251 (Cyr), а потом воспользоваться замечательным хаком имени самого Билла Гейтса. Если некоторый байт в файле шрифта будет изменен с 00 на CC, то такой шрифт будет считаться кириллическим, т.е. имеется в виду, что у этого шрифта неюникод программы будут обращаться к CP1251, что нам и нужно! (Речь идет о старшем байте поля fsSelection таблицы OS/2. Это недокумментированная и более того, противоречащая спецификации TrueType фича, но именно так были устроенны системные национальные шрифты в Win3.11.) Можно это сделать вручную, если знать, как этот байт искать, но проще воспользоваться FontLab. Делается это так: Microsoft Character Set ставится Cyrillic CP1251, чтобы избежать глюков с некоторыми юникод программами (напр., Word 8/97) ставим еще и Supported CodePages: 1252 и 1251. Потом в св-вах TrueType ставим галочку на Put MS Char Set into fsSelection field. Дело в шляпе (сорри за каламбур). Эта фишка будет работать под Win3.11, Win9x, w2k (и скорее всего XP тоже; под NT — не знаю).
Теперь от теории к практике
В те времена, когда о юникоде знали только в Микрософте, было сделано много кириллических шрифтов, у которых кириллица располагалась на месте расширенной латиницы, т.е. CP1252 (WE). Естественно в юникодных программах кирилица у них работать не хотела.
Как такие шрифты "лечить": любым из трех способов.
Проще всего №1 — можно воспользоваться общеизвестной досовской утилиткой ttfconv.exe, которая сдублирует кириллицу с 1252 на 1251. Надо только иметь в виду, что эта утилита не сдублирует 6 сербских и македонских символов:
138 U+0409 CYRILLIC CAPITAL LETTER LJE
140 U+040A CYRILLIC CAPITAL LETTER NJE
131 U+0453 CYRILLIC SMALL LETTER GJE
154 U+0459 CYRILLIC SMALL LETTER LJE
156 U+045A CYRILLIC SMALL LETTER NJE
159 U+045F CYRILLIC SMALL LETTER DZHE
Способами №2 и №3 я сам практически не пользовался. На первый взгляд там все работает (№2 вообще совершенно законный), но кто их знает...
А вообще под w2k/XP если вы пользуетесь неюникодными программами, то переходите на шрифты type1 - во избежание проблем с выводом на postscript принтер.
[Версия 1.0]
Это сообщение было отредактировано: Kassian, 18 Фев, 2004 г. - 21:46
К сожалению, первое предупреждение из трех возможных. Дублирование сообщения; вопрос не по теме (тут обсуждаются truetype, а не opentype).