Войти
  1. ВКонтакте
  2. Facebook
  1. »
  2. »
  3. »
  4. Логический шрифт
Скрыть панель справаПоказать панель справа

Логический шрифт

Мастер
  1. Офлайн
  2. Команда сайта.
  3. 901 сообщений
  4. Репутация: 9
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 1 отправлено 11:24, 12.05.2015
Логический шрифт
Исправляем некорректное отображение кириллицы


Итак, вы сделали перевод любимой программы на русский язык, создали локализованный файл, запустили приложение и, вдруг, вместо знакомых символов видите какую-то несуразицу, типа "". Блин, что делать? Самое простое решение — выполнить замену кодовых страниц в операционной системе и добавить в реестр параметры подмены шрифтов. К сожалению, такое решение является грубым и будет работать только на вашей системе. Другие пользователи, воспользовавшись вашей работой, вместо текста на русском увидят эту несуразицу и им также придется вносить изменения в свою систему. Это в свою очередь может быть чревато негативными последствиями для других приложений. Впрочем я не буду останавливаться на этом подробно, а предлагаю вам решить проблему отображения символов кириллицы более изящно — в самом файле приложения. Конечно для этого нужны умение работы с отладчиком, знание API-функций и понимание ассемблерных инструкций. Решение не из простых и потребует от вас определенных навыков.

Надеюсь, что это небольшое руководство поможет вам самостоятельно справиться с этой проблемой.

В данном руководстве рассматриваются API-функции CreateFont и CreateFontIndirect, которые используются для создания логического шрифта. Этот шрифт впоследствии также может использоваться приложением для вывода текстовой и другой информации.

Онлайн версия руководства:

Вашей группе Гости запрещён просмотр скрытого текста.


CHM версия руководства:

Вашей группе Гости запрещён просмотр скрытого текста.


Последний раз редактировал Leserg 14:46, 23.07.2017

------------------------------------------
Кто ищет, тот всегда найдет!
Знаток
  1. Офлайн
  2. Знаток
  3. 279 сообщений
  4. Репутация: 1
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 2 отправлено 12:13, 12.05.2015
Спасибо, очень познавательно и много нового.
Старожил
  1. Офлайн
  2. Администраторы
  3. 622 сообщений
  4. Репутация: 1
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 3 отправлено 23:16, 13.05.2015
Цитата Leserg ()
В данном руководстве рассматриваются API-функции CreateFont и CreateFontIndirect

Довольно редкостное явление. У меня такое было всего один раз, но зато намучался я изрядно wacko

Еще бы надо создать мануал по программам на Дельфи, где в ресурсах встречаются ANSI_CHARSET. Довольно часто переводчики наступают на эти грабли.
Мастер
  1. Офлайн
  2. Команда сайта.
  3. 901 сообщений
  4. Репутация: 9
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 4 отправлено 00:42, 14.05.2015
Цитата Nexus ()
Довольно редкостное явление.

Я с этим сталкиваюсь довольно часто, в связи с этим и появилась задумка написать это руководство.

Цитата Nexus ()
Еще бы надо создать мануал по программам на Дельфи, где в ресурсах встречаются ANSI_CHARSET

Nexus, я писал об этом в своих руководствах. Да толку ноль, их никто не читает, как впрочем и это. sad


------------------------------------------
Кто ищет, тот всегда найдет!
Сталкер
  1. Офлайн
  2. Проверенные
  3. 80 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 5 отправлено 17:00, 14.05.2015
Цитата Leserg ()
...никто не читает...
Позвольте с вами не согласиться! Читают!
Другое дело -  откликов нет/мало. Причина, как мне кажется, в серьезности материала, требующего осмысления, попыток практического применения, изучения дополнительных материалов и т.п.
Например, для меня  - это пока не очень понятно и довольно-таки сложно. И не потому, что плохо написано. Как раз, наоборот - это мне не хватает знаний!
Ваш материал уникален и он будет востребован. Поэтому, не поддавайтесь сомнениям и продолжайте.
Спасибо!
Знаток
  1. Офлайн
  2. Команда сайта
  3. 404 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 6 отправлено 08:29, 15.05.2015
Цитата Leserg ()
Да толку ноль, их никто не читает, как впрочем и это

Читают, ещё как читают!
Статья очень полезная, лично я почерпнул из неё многое.
А то уже наверное Nexus устал мне кодировку править.


------------------------------------------
Храни меня Господь от тех, кому я верю. Кому не верю - тех остерегусь я сам.

Сталкер
  1. Офлайн
  2. Команда сайта
  3. 133 сообщений
  4. Репутация: 3
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 7 отправлено 09:20, 15.05.2015
Leserg, СПАСИБО, присоединяюсь к предыдущим отзывам. И уже попытался применить на практике к одной проблемной для меня программе (точнее крякнутому основному исполняемому файлу) написанной на C++ (правда пока безуспешно, но в этом мои слабые познания, а точнее их отсутствие о C).
Мастер
  1. Офлайн
  2. Команда сайта.
  3. 901 сообщений
  4. Репутация: 9
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 8 отправлено 22:21, 17.05.2015
Спасибо, парни, за поддержку. Согласен, что информация не простая, требует некоторого осмысления и лежит совершенно в иной плоскости от того, что обычно принято считать локализацией. Смею вас заверить, что это еще цветочки по сравнению с теми дебрями, которые вас поджидают при попытке локализации приложений написанных при использовании библиотеки Qt. biggrin


------------------------------------------
Кто ищет, тот всегда найдет!
Старожил
  1. Офлайн
  2. Администраторы
  3. 622 сообщений
  4. Репутация: 1
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 9 отправлено 22:55, 17.05.2015
Цитата Leserg ()
Смею вас заверить, что это еще цветочки по сравнению с теми дебрями, которые вас поджидают при попытке локализации приложений написанных при использовании библиотеки Qt.

Чувствую, камень в мой огород biggrin
Я вот как раз и хотел на тебя навесить написание мануала по QT, но ты ж не захотел happy
Мастер
  1. Офлайн
  2. Команда сайта.
  3. 901 сообщений
  4. Репутация: 9
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 10 отправлено 23:29, 17.05.2015
Цитата Nexus ()
Я вот как раз и хотел на тебя навесить написание мануала по QT, но ты ж не захотел

Но как можно написать про то, чего никогда не делал, не понимаешь и не знаешь как это делается? Попроси, например, ruslangxp написать такое руководство. Что из этого выйдет? Толковый материал получается у того, кто сам занимался вопросом и его решением. У нас на форуме есть неплохой топик, где мы делимся особенностями той и иной программы. Ребята, просто возьмите и напишите с чем вы столкнулись при локализации и как решили этот вопрос. Это неоценимый опыт, которым можно пользоваться, изменять и подстраивать под свои нужды. Nexus, у тебя здорово получается править Qt приложения под поддержку кириллицы, но ты не рассказываешь, КАК ты это делаешь! wink


------------------------------------------
Кто ищет, тот всегда найдет!
Легенда
  1. Офлайн
  2. Админ
  3. 1656 сообщений
  4. Репутация: 2
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 11 отправлено 12:28, 18.05.2015
Цитата Leserg ()
Но как можно написать про то, чего никогда не делал, не понимаешь и не знаешь как это делается?


Согласен, надо мануал с картинками и кроликом, как всегда, и подробный метод нахождения.
А писать его должен ты, Nexus, тебе не отвертеться biggrin


------------------------------------------
Старожил
  1. Офлайн
  2. Администраторы
  3. 622 сообщений
  4. Репутация: 1
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 12 отправлено 23:15, 22.05.2015
Leserg, вот как раз по CreateFontIndirect есть интересный экземпляр и тоже решается таким способом:

Прикол в том, что так просто здесь не выкрутиться, нужно проявить смекалку чтобы решить багу. Попробуй, получится ли у тебя догадаться в чем загвоздка biggrin Если нет, то подскажу решение, хотя смльно сомневаюсь что подсказка понадобится happy
Легенда
  1. Офлайн
  2. Админ
  3. 1656 сообщений
  4. Репутация: 2
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 13 отправлено 23:53, 22.05.2015
Цитата Nexus ()
Leserg, вот как раз по CreateFontIndirect есть интересный экземпляр и тоже решается таким способом:


Друзья, файлы пересылайте в личке, этот файл пролеченный и выставлять его на всеобщее обозрение рановато.


------------------------------------------
Мастер
  1. Офлайн
  2. Команда сайта.
  3. 901 сообщений
  4. Репутация: 9
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 14 отправлено 22:28, 28.05.2015
Nexus;16333 писал:вот как раз по CreateFontIndirect есть интересный экземпляр... Попробуй, получится ли у тебя догадаться в чем загвоздка...






Последний раз редактировал WYLEK 16:03, 06.02.2017

------------------------------------------
Кто ищет, тот всегда найдет!
Старожил
  1. Офлайн
  2. Администраторы
  3. 622 сообщений
  4. Репутация: 1
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 15 отправлено 00:10, 29.05.2015
Leserg, значит все таки обратил внимание какую подлянку делает команда REP STOS DWORD PTR [EDI] biggrin
Мастер
  1. Офлайн
  2. Команда сайта.
  3. 901 сообщений
  4. Репутация: 9
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 16 отправлено 00:26, 30.05.2015
Цитата Nexus ()
все таки обратил внимание какую подлянку делает команда REP STOS DWORD PTR [EDI]

Почему подлянку?! Как раз наоборот, подготавливает область памяти под массив с характеристиками шрифта. Все логично. Многие свойства шрифта по умолчанию имеют значения 0 (ноль), поэтому нет смысла их задавать по отдельности. Правда в своей практике я с таким случаем сталкиваюсь впервые. Однозначно в копилку знаний. biggrin


------------------------------------------
Кто ищет, тот всегда найдет!
Старожил
  1. Офлайн
  2. Администраторы
  3. 622 сообщений
  4. Репутация: 1
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 17 отправлено 23:08, 30.05.2015
Цитата Leserg ()
Почему подлянку?! Как раз наоборот, подготавливает область памяти под массив с характеристиками шрифта. Все логично.

Потому что из-за этой команды приходится переносить фрагмент кода в конец файла, некуда здесь втиснуть команду MOV DWORD PTR [ESP+93], 1. Это хорошо что здесь в конце секции кода имеется резерв куда можно примостить свой кусочек кода, в этом файле нужно подправить аж пять таких проблемных мест. А не редко мне попадались файлы, где такой резерв в конце попросту отсутствовал. Приходилось или удлинять секцию кода, или же впихивать свои наработки в промежутки между функциями\процедурами, там где встречается последовательность байт CCCCCCCC... или 9090909090...
И вообще, я лично вместо MOV DWORD PTR [ESP+93], 1 вбил MOV DWORD PTR [ESP+90],CC000000, вдруг у конечного пользователя будет не русская локаль, и тогда будут крякозябли. А так надежнее, все для пользователя, его родимого biggrin
Мастер
  1. Офлайн
  2. Команда сайта.
  3. 901 сообщений
  4. Репутация: 9
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 18 отправлено 11:26, 31.05.2015
Nexus, подожди, не кипятись. Обрати внимание, я вместо инструкции MOV DWORD PTR [ESP+93],1, использую инструкцию MOV BYTE PTR [ESP+93],1. Она на три байта короче предыдущей за счет указания другого типа данных. Тип DWORD нуждается в 4-х байтах, а BYTE - всего лишь в одном байте. С таким же успехом можно задать набор символов RUSSIAN_CHARSET, записав вместо 1h значение CCh: MOV BYTE PTR [ESP+93],0СС. Нет нужды использовать тип данных "двойное слово", если нужно изменить всего лишь один байт. Экономия в три байта это вполне существенно, особенно при не хватке или отсутствии достаточно свободного места. Мне тоже попадались программы, где свободного места в конце секции кода не было вообще, и, конечно, приходилось выкручиваться описанными тобой способами.

В данном конкретном случае можно обойтись без переноса кода. Нужно всего лишь немного подумать. Смотрим код:



По адресу 00404026 находится инструкция MOV DWORD PTR [ESP+7С],0Е. Её можно изменить на MOV BYTE PTR [ESP+7С],0Е, т.к. ранее область памяти под характеристики шрифта была очищена (заполнена нулями). Таким образом получим выигрыш в три байта. Далее, по адресам 00404010 - 00404020 идет побайтовая запись строки с названием шрифта. Это все можно заменить двумя инструкциями. В итоге код программы примет следующий вид:



Как видишь, по адресу 00404038 у нас еще один байт лишний остался. Но полученный код делает все тоже самое, что и оригинальный, но кроме него добавлена еще одна инструкция по установке набора символов (по адресу 00404030). Если нужна кириллица, то замени в ней значение 1h на CCh. Еще раз посмотри: мы ничего и никуда не переносили, только переделали участок кода.

Последний раз редактировал WYLEK 16:07, 06.02.2017

------------------------------------------
Кто ищет, тот всегда найдет!
Мастер
  1. Офлайн
  2. Администраторы
  3. 1263 сообщений
  4. Репутация: 2
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 19 отправлено 21:45, 31.05.2015
LesergNexus,  это уже высшая математика, нам простым смертным да такого очень далеко wink


------------------------------------------
\"Возможно всё! На невозможное просто требуется больше времени.\"
Мудрец из Шангри Ла
Знаток
  1. Офлайн
  2. Знаток
  3. 279 сообщений
  4. Репутация: 1
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 20 отправлено 00:01, 01.06.2015
Leserg, Nexus

Цитата
Приходилось или удлинять секцию кода...

А программой Topo v1.2 можно решать такие проблемы?

Последний раз редактировал dinis124 10:36, 01.06.2015
Старожил
  1. Офлайн
  2. Администраторы
  3. 622 сообщений
  4. Репутация: 1
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 21 отправлено 00:07, 01.06.2015
Leserg, ты допустил ошибку что похерил цикл побайтовой записи строки с названием шрифта Arial. Теперь программа не воспринимает название шрифта и выдает на экран тот, который стоит по умолчанию в системе пользователя. Попробуй после своей модификации поменять название шрифта Arial на Arial Black. В результате ничего не поменяется. А в оригинальном файле текст в окне About будет написан жирным шрифтом. В чем же причина? Причина в том, что на стек нужно запсывать собственно название шрифта, а после твоей правки на стек записывается адрес, где лежит название шрифта. В результате API функция CreateFont считывает какую-то белиберду вместо названия шрифта, ищет его в системе, естественно не находит и выставляет систеный шрифт по умолчанию, смотря у кого какой установлен.
Единственное место где можно подоптимизировать - это поменять MOV DWORD PTR [ESP+8C], 320 на MOV WORD PTR [ESP+8C], 320. Выигрыш будет еще в один байт. Дело в том, что DWORD - это 4 байта, а число 320 - это два байта, поэтому поставим WORD,т.е. двухбайтовое выражение. Только толку от такой оптимизации все равно никакой...
Цитата gazon01 ()
Leserg, Nexus,  это уже высшая математика, нам простым смертным да такого очень далеко

Фигней страдаем biggrin
Мастер
  1. Офлайн
  2. Команда сайта.
  3. 901 сообщений
  4. Репутация: 9
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 22 отправлено 00:43, 02.06.2015
Nexus;16429 писал:Leserg, ты допустил ошибку


Твоя правда. Тогда можно сделать так:



В этом случае тоже, ничего и никуда переносить не нужно.
Для адресации используем адрес из регистра ECX, который в текущий момент там находится. Тогда смещение будет меньше значения 7F, что уменьшит длину инструкций. Также не забываем оперировать типами данных (BYTE, WORD, DWORD).

Nexus;16429 писал:Фигней страдаем


Ага, и не говори. Он даже gazon01'у стало интересно, чем это мы тут занимаемся. Там гляди народ потянется и больше не будет проблемы под названием "кракозябры". Надо почаще такие диспуты устраивать.

dinis124;16428 писал:А программой Topo v1.2 можно решать такие проблемы?

Я не знаю, никогда такой программой не пользовался. Вообще весь мой опыт по удлинению секций сводился к дописыванию нулевых байтиков в конце файла при помощи НЕХ-редактора.

Последний раз редактировал WYLEK 16:14, 06.02.2017

------------------------------------------
Кто ищет, тот всегда найдет!
Прибывший
  1. Офлайн
  2. Участники
  3. 8 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 23 отправлено 17:33, 06.01.2016
Может кто помочь исправить кракозябры https://yadi.sk/d/5y-g6KHLmhuwR


------------------------------------------
Перевод не получился на тебя .. свалился...
Старожил
  1. Офлайн
  2. Администраторы
  3. 622 сообщений
  4. Репутация: 1
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 24 отправлено 01:22, 07.01.2016
aNNiPAk, Просьба ни о чем. Да и не в нужной теме. Так что какой вопрос, такой и ответ - 0.
Прибывший
  1. Офлайн
  2. Участники
  3. 3 сообщений
  4. Репутация: 0
  5. Сообщение
  6. Личные данные
Полезность: 0 | сообщение № 25 отправлено 19:30, 18.01.2016
Цитата Kopejkin ()
Позвольте с вами не согласиться! Читают! Другое дело -  откликов нет/мало. Причина, как мне кажется, в серьезности материала, требующего осмысления, попыток практического применения, изучения дополнительных материалов и т.п.
Например, для меня  - это пока не очень понятно и довольно-таки сложно. И не потому, что плохо написано. Как раз, наоборот - это мне не хватает знаний!
Ваш материал уникален и он будет востребован. Поэтому, не поддавайтесь сомнениям и продолжайте.
Спасибо!
Присоединяюсь полностью, долго не мог разобраться с кодировкой..., по инструкции - на раз..
Ребята... ваша работа реально нужна    СПАСИБО !!
 
Перейти
Найти

Доступ закрыт.

  1. Вам запрещено отвечать в темах данного форума.

Последние темы

  1. WonderFox HD Video Converter Factory...
    Автор: 78Sergey Вчера, 23:46
  2. Поговорим?
    Автор: 78Sergey Вчера, 00:51
  3. Autoruns 13.81 rus
    Автор: druc 17:29, 14.12.2017
  4. Русская версия (RuPack) Imagenomic...
    Автор: troa 10:53, 12.12.2017
  5. RecordPad Sound Recorder 5.35
    Автор: troa 07:10, 12.12.2017
  6. Debut Video Capture Pro 4.09 Rus
    Автор: 78Sergey 00:30, 11.12.2017

Изменения статуса

  1. Никто не менял личный статус.