Описание моих опытов по созданию шрифтов с сабжем. Возможно, это будет интересно почитать и прокомментировать.
Для начала - краткая инфа с сайта Казарновского:
-----------------------------------------
- Microsoft Symbol Encoding предназначена для нетекстовых шрифтов, содержащих различные оформительские элементы. Формально субтаблица cmap в таких шрифтах также содержит юникоды символов, но они находятся в так называемой пользовательской области Unicode (Private Use Area), а реально - в области U+F020 до U+F0FF, отображаясь естественным образом в однобайтовые коды 0x20...0xFF.
- charset Symbol, определяющая его таблица - это непрерывный отрезок кодов
0xF000-0xF0FF, явным образом она в ресурсах не присутствует.
- никак не могу найти источник, где бы был конкретизирован формат шрифта
в Symbol Encoding. Похоже, что это не спецификация TrueType
----------------------------------------------------------------
1. Итак, работаем в FontLab. Bыбираю кодовую страницу MS Windows Symbol, символы которой находятся в Private Use Area
в диапазоне F020-F0FF. Заполняем ее нужными символами - хоть бы и все 256, в FontInfo>Encoding задаем Symbol Character Set, и генерим.
Все работает как надо. Кстати, в вордовском шрифтовом меню для таких шрифтов название пишется системным шрифтом, что в данном случае удобно. Именно так сделаны
виндовые Symbol и Windings. Ну, тут все ясно, такие символьные шрифты я делаю без проблем.
Но это если в шрифте есть только одна кодовая страница - Symbol. А вот как бы ее добавить в многоязычный шрифт, где уже есть несколько кодовых страниц,
да так, чтобы ее можно было использовать в неюникодовых приложениях, типа ПМ итп.?
2. Беру шрифт, в котором уже есть CP 1251 и 1252. Далее все так же: выбираю MS Windows Symbol (F020-F0FF), леплю туда нужные символы, в FontInfo>Encoding задаю Symbol Character Set. Получаю шрифт (напр., Font!). Теперь надо что-то вписать в win.ini (или в реестр, depending of).
WGLAssistant видит в моем шрифте кодовые таблицы Cyrillic и Special. Хорошо. Cмотрю, что же он вписал в win.ini.
Вижу вот что:
Font! Symbol,2=Font!,2
Font! Cyr,204=Font!,204
Ожидалось бы, что после перезагрузки я увижу в приложениях три шрифта:
Font!
Font! Symbol
Font! Cyr
A фиг там. Есть только Font! и Font! Cyr, причем в первом пропала часть символов (смотрю фонтвювером от WinMe).
Пока и все.
Это сообщение было отредактировано: Vouk, 19 Ноя, 2003 г. - 21:52
Kassian
Nov 19 2003, 23:07
Эге, интересненько.
Как я понимаю, речь идет о Win9x, а не об NT системах, т.к. в последних субституты прописываются в реестре, а не в win.ini (что кстати чертовски неудобно).
Понятное дело, строки вида
Font! Symbol,2=Font!,2
Font! Cyr,204=Font!,204
в win.ini являются отсылками к соответствующим разделам файла gdi.exe, где лежат таблицы перекодировки Unicode <-> ANSI, что нужна для неюникодных программ.
Я давно не общался с Win.9x, но мне кажется, что в ихнем gdi.exe и нет таблицы для диапазона Symbol! Или же, например, отсылка должна идти не как "2", а по-другому.
Можно в gdi.exe залезть каким-нибудь редактором ресурсов и посмотреть.
Если действительно этой таблицы там нету, то скорее всего ее можно будет составить самому и вписать в gdi.exe.
P.S. Кстати там же, в gdi.exe, можно исправить безобразия, связанные с введением евро. Т.е. приписать этому ANSI коду старый юникод, который был закреплен до евро. Нужно, например, если у тебя пользовательский шрифт, где на этом месте сидит какой-нибудь нужный символ.
>Я давно не общался с Win.9x, но мне кажется, что в ихнем gdi.exe и нет таблицы для диапазона Symbol!
этот диапазон используется там давным-давно, но только он недокументирован. Symbol и Windings именно так устроены с незапамятных времен.
>Или же, например, отсылка должна идти не как "2", а по-другому.
Ну это ж не я придумал, а WGLAss так написал.
Видно, все ж не задумывалось это дело для многостраничных кодировок. А жаль.
Kassian
Nov 20 2003, 00:00
Разве Symbol и Windings прописываются в win.ini? Что-то не помню. Если прописываются, то с каким номером? Тоже "2"?
А зачем же им там прописываться, если в них только одна СР Symbol?
Так же, как не надо прописывать и шрифт, имеющий только одну СР1251.
+
Подправить винду это одно, а интересно же поисследовать, как оно там было задумано. Пока что мне кажется, что по-нормальному это не удастся, т.к. symbol encoding, видимо не прeдполагался для использования в многотабличных шрифтах. Если в шрифте указано наличие CP Symbol, тогда неправильно отображается CP1252.
Это сообщение было отредактировано: Vouk, 20 Ноя, 2003 г. - 01:07
Kassian
Nov 20 2003, 01:07
А затем.
Затем, что субституты нужны не для шрифтов у которых CP больше, чем одна, а для тех шрифтов, у которых юникод кодировка отличается от 1252, т.е. WE! И сколько там будет содержаться CP - не важно совершенно.
При помощи таблиц в gdi.exe отличные от 1252 диапазоны идентифицируются как 256 символов ANSI.
Думаю, что для шрифтов Symbol и Windings эта процедура не нужна по той причине, что первые байты юникодномеров у них совпадают с 1252.
Возможно, тебе поможет вписывание в gdi.exe таблицы для этого диапазона Symbol. Но возможно, что и нет.
>Затем, что субституты нужны не для шрифтов у которых CP больше, чем одна, а для тех шрифтов, у которых юникод кодировка отличается от 1252, т.е. WE
Это что за новости?
Берешь любой шрифт, в котором есть кириллица в единственной СР 1251, устанавливаешь и пользуешься. А вот если там есть и 1252 и 1251 - вот тогда надо для кириллицы делать подстановку..
Kassian
Nov 20 2003, 02:45
Так, минуточку. Может я конечно чего-то и забыл про win9x, но все же мне кажется, что в неюникод приложениях заставить работать шрифт, где есть только 1251, можно было двумя способами:
1. Сделать субст в win.ini
2. Изменить один байт в коде шрифта, чтобы винда его опознала как кириллический.
Кажется про второе Казарновский пишет
тут:
Цитата
Одноязычные шрифты из (интер)национальных (\"локализованных\") версий Win 3.1 - единственная их кодовая страница указывается в старшем байте поля fsSelection, причем указывается внутрипрограммное микрософтовское обозначение набора символов (для script cyrillic - 204=0xCC). Такие шрифты корректно распознаются как в национальных версиях Windows 3.1*, так и в Windows'9x. Однако это не только не документировано, но и противоречит спецификациям TrueType - как первому выпуску rev. 1.0, так и последнему пересмотру rev. 1.66, где однозначно требуется, чтобы неиспользуемые биты fsSelection были равны нулю.
Уфф, чето ты не про то совсем.
>в неюникод приложениях заставить работать шрифт, где есть только 1251, можно было двумя способами
Неюникодное приложение не надо ”заставлять” работать с таким шрифтом. Оно с ним работает с удовольствием. Конечно, если это правильный шрифт, т.е. символы на своих местах, и uranges выставлены правильно (а других я в хозяйстве не держу давно).
”Заставлять” приходится, если
а) в шрифте больше одной СР, тогда приложение видит из них только СР1252, и нужно с помощью подстановок создать сечения для других таблиц, как бы фиктивные шрифты, с которыми приложение и работает (это твой п.1);
б) шрифт кривой, т.е. или символы не на своих местах, либо таблицы не в порядке, и т.п. Тогда и байт поменять, и разнообразные конвертеры, и прочая дребедень, совсем неинтересная.
Повторяю: впредь имею в виду только правильные шрифты.
И Win9x тут ни причем, неюникодовые приложения (Pagemaker, Framemaker, Quark и т.д.) точно по такой же схеме работают и под Win2k. Только прописывают не в win.ini, а в реестр.
В этой цитате у Казарновского не совсем об этом. Хотя влияние этих старших битов - неизученный мной еще вопрос. Кстати, ФЛ тоже может записывать туда обозначение скрипта - Put MS Char Set value into fselection field при экспорте.
Kassian
Nov 20 2003, 03:53
А мне вот почему-то кажется, что это ты не особо хочешь понять ту информацию, которую я тебе выдаю. Впрочем, как я уже заметил, ты очень любишь поспорить. Ну что ж, готов оставить за тобой последнее слово.
Послушай, все, о чем я написал, ты ведь можешь взять и попробовать сам. Вот берешь шрифт, ставишь, смотришь. Комп ведь перед тобой, в чем же дело? Если факты не сответствуют мной написанному, так выкладывай на бочку. Я же вроде как с аргументами в руках спорю, и не оттого что мне делать нечего.
Kassian
Nov 20 2003, 04:07
Ты прав. Ну что ж. Поставлю себе сейчас Win98 ради такого дела. О результатах сообщу.
Cамоцитата:
---------
неюникодовые приложения (Pagemaker, Framemaker, Quark и т.д.) точно по такой же схеме работают и под Win2k. Только прописывать не в win.ini, а в реестр.
-----------
Kassian
Nov 20 2003, 06:14
Вот что, уважаемый Vouk. Сейчас потратил два часа своего рабочего времени на то, чтобы доказать тебе очевидный факт.
Поставил Win98SE Eng, ATM 4.0 Delux, WinWord 6.
Взял FL 3.0E. Сделал новую базу в 1251. Нарисовал "A" на 0041 и "А" на 0410. Поставил ему поддержку CP 1251. Сгенерил шрифт.
В ворде латиница с клавиатуры набирается, а кириллица - нет.
Сделал ему субст Cyr в win.ini. Перезагрузился.
В шрифте Cyr набирается и латиница и кириллица.
Можно субст не делать, изменить в коде шрифта один байт, как советует Казарновский. Тогда винда тоже увидит кириллицу.
Надеюсь, теперь ты перестанешь упорствовать и ломиться в открытую дверь. Специально повторяю: При помощи таблиц в gdi.exe отличные от 1252 диапазоны идентифицируются как 256 символов ANSI.
Что касается твоей проблемы с диапазоном Symbol, то в третий раз повторю мой совет: попробуй покопаться в gdi.exe редактором ресурсов. Я не знаю, есть ли там таблица для этого диапазона, но это не мешало бы выяснить в первую очередь. Если нет, то выход один - вписывать эту таблицу руками (если это вообще возможно, я не программер).
Стоит WinMillenium Rus. (ATM вроде тут ни при чем. Hа всякий случай - я все время имею в виду ttf).
Беру FL456. Сделал новую базу в 1251, скопировал туда из другого шрифта все символы для СР1251. Указал наличие оной в Fontinfo > Encoding&. Сгенерил шрифт. Установил.
Смотрю в виндовый Charmap - шрифт виден с кириллицей.
Шестого ворда нет у меня, да и зачем он. Вместо него пробуем Wordpad. Кириллица набирается там нормально (будет проблемка с вводом как раз английского текста, потому что англ. раскладка клавиатуры зачем-то сдуру привязана именно к СР1252, которой в шрифте нет, хотя все англ. буквы есть и в 1251. Но это - другая проблема. То же самое, кстати, и в ворд2000).
Следующий представитель неюникодовых приложений - ПМ7. Вот в нем набирается и латиница и кириллица, без субстов. Создаю вордовый файл с кириллицей и данным шрифтом, - в ПМ он помещается без вопросов, шрифт на месте. Фрейм и Кварк на работе, но там именно так всю жизнь и работает.
WGLASSistant этого шрифта не видит, потому что он вообще видит только шрифты, у которых больше одной CP.
Для эксперимента написал вручную в win.ini: Sample Cyr,204=Sample,204
После перезагрузки все осталось по-прежнему, нигде не появился шрифт Sample Cyr - и это правильно.
Вот лежит этот шрифт для примера, возьми посмотри. А также приглашаются все желающие, а то че за непонятки, только у меня одного работает.
> для шрифтов Symbol и Windings эта процедура не нужна по той причине, что первые байты юникодномеров у них совпадают с 1252
?? не поэл? подробнее, плз. Какие байты чего с чем совпадают.
>При помощи таблиц в gdi.exe отличные от 1252 диапазоны идентифицируются как 256 символов ANSI.
Да что тут нового? Вот уж действительно в открытую дверь.
>то в третий раз повторю мой совет: попробуй покопаться в gdi.exe редактором ресурсов.
Не буду :-P :-P
Все же к вопросу о symbol encoding.
1) Не удалось мне установить, на что влияет строка Font Symbol,2=Font,2 которую пишет WGLAssist в win.ini. Что она есть, что нет - все одно. У автора спросить, что ли?
2) информация к размышлению: если в ФЛ в Fontinfo > Encoding& > Character set information > Microsoft Character Set (это справа внизу) указать Symbol, то в сгенеренном шрифте будет записано только наличие Symbol character set, независимо от того, сколько их там есть фактически.
Это сообщение было отредактировано: Vouk, 20 Ноя, 2003 г. - 16:06
Kassian
Nov 20 2003, 18:01
Vouk
Слушай, я просто не понимаю, зачем ты здесь запостил свой материал? Чтобы все ахнули, какой ты знающий и продвинутый? В этом тебе никто не отказывает, поверь мне.
Но обычно на бордах появляются посты в рассчете на обсуждение и узнавание новой информации.
Я тебе сообщил путь, по которому можно двигаться для решения твоей проблемы с диапазоном Symbol.
Попутно я сообщил тебе явно новую для тебя информацию, касающуюся всей этой механики с субстами и таблицами в gdi.exe. Чтобы устранить твои заблуждения, я даже провел двухчасовой эксперимент (хотя проводил его не раз и раньше, но сейчас освежил в памяти).
Вместо того, чтобы сказать мне спасибо, ты начинаешь ломиться в открытую дверь и делать вид, что тебе итак все давно известно по этой теме и вообще ты являешься тут главным гуру. Это не так. Гуру тут нет в принципе. Ни я, ни
nik7777, ни Казарновский, ни кто другой не представляем себе всех тонкостей этой механики. Работа со шрифтами в MS Windows слишком сложная и недокументированная вещь.
Теперь несколько конкретных замечаний.
Цитата
Стоит WinMillenium Rus
Я не имел никогда дела с Линолеумом. Все мои посты были про Win95 & Win98 (а также про Win 3.1x).
Цитата
Беру FL456
Я в своем эксперименте специально пользовался старым FL, т.к. есть подозрение, что новые версии принудительно прописывают в коде шрифта этот байт CC, отвечающий за кириллицу.
Цитата
Вместо него пробуем Wordpad
Я не уверен, что WordPad в Линолеуме является неюникодным.
Цитата
WGLASSistant этого шрифта не видит, потому что он вообще видит только шрифты, у которых больше одной CP.
Не знаю, как для Линолеума, но для Win9x это вранье полное. Если этому шрифты в явном виде прописать поддержку 1251 (например, в FL: Supportet Codepage), то возможно разложение на субст Cyr и WGLAssistance этот шрифт увидит. Собственно сегодня ночью я этот эксперимент и проделал. Правда специально был взят старый FL, который точно не прописывает этот хитрый байт CC имени Казарновского.
Цитата
> для шрифтов Symbol и Windings эта процедура не нужна по той причине, что первые байты юникодномеров у них совпадают с 1252
?? не поэл? подробнее, плз. Какие байты чего с чем совпадают.
Во-первых, не надо искажать мою цитату. Я сказал аккуратнее:
Цитата
Думаю, что для шрифтов Symbol и Windings эта процедура не нужна по той причине, что первые байты юникодномеров у них совпадают с 1252.
Не готов отстаивать свою точку зрения. Даже скорее всего думаю, что я ошибся. Это вопрос, требующий большого исследования. И даже Казарновский говорит, что ему тут многое не ясно.
Для себя тему считаю закрытой в том, что касается субстов и gdi.exe, но оставляю за тобой возможность последнего слова, которое ты так любишь.
Если достигнешь каких-нибудь результатов (положительных/отрицатетельных) с диапазоном Symbol, то сообщи plz. Это интересно.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста,
нажмите сюда.