Как это не странно, но во времена UNICODE все еще встречается проблема знаками вопроса или кракозябрами вместо кириллицы (русских букв).
Проблема наблюдается в программах с русскоязычным интерфейсом, которые написаны на Delphi 7, вместо русских букв показывают знаки вопроса. Перевод проекта под UNICODE-версию Дельфи (2010 или 2009) практически не возможен, так как в нем используются компоненты, которые не имеют новых UNICODE-совместимые версии (авторы больше не поддерживают компоненты).
Удивляет не то, что GUI программ не показывает русские буквы, а то, что вместо кракозябр показываются знаки вопроса. Кракозябры — это символы текущей кодировки, с теми же кодами, что у нужных нам русских букв. Знаки вопроса обычно появляются когда у системы не получается сопоставить используемый символ UNICODE (к примеру, русская буква из UNICODE) с символом теперешней кодировки.
ОС Windows 7, Windows Vista и Windows XP имеют настройку локалей. Она находиться по адресу: Панель Управления->Язык и национальные стандарты-> последняя вкладка «Дополнительно». Там можно указывать язык для программ, которые не поддерживают Юникод. По логике, после выбора, в этой вкладке, русского языка, программа должна правильно показывать русские буквы. Но на деле русские буквы отображаются только в компонентах ColorBox и в шапке программы. Во всех других компонентах интерфейса отображаются все те же знаки вопроса.
Странно, но проблему решит другая настройка: Панель Управления->Язык и национальные стандарты->Региональные параметры». Эта вкладка отвечает за формат денежных единиц, чисел, дат и времени. И вроде бы не имеет отношения к кодировкам. Но все-таки, если установить значение «Русский, Россия», то знаки вопроса исчезнут и интерфейс программы начнет показывать либо русские буквы, либо кракозябры, в зависимости от того, какая локаль указана на вкладке «Дополнительно».
Ниже приводятся результаты разных комбинаций этих двух настроек в ОС Windows, начиная с XP:
Формат: США
Локаль: США
Итог: Всюду знаки вопроса
Формат: США
Локаль: Россия
Итог: В шапке и колорбоксах русские символы, во всем другом знаки вопроса
Формат: Россия
Локаль: США
Итог: Везде «крякозябры»
Формат: Россия
Локаль: Россия
Результат: Все хорошо!
Также, если не помогает, можно советует делать следующее: сбросить поле Format в English (United Sates) и вернуть обратно в Russian (Russia), или еще цитата: «Мне помогла смена формата сначала на английский, потом выход из системы, вход в систему и установка формата в русский»
Ну и способ с редактированием реестра (именно он в последнее время чаще всего выручает):
Запускайте REGEDIT и редактируйте на:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
“1250″=”c_1251.nls”
“1252″=”c_1251.nls”
Огромное спасибо! Выручили)))
Отлично! Нужно было переделать другу какой-то проэкт в Delphi 7 —
Формат: Россия
Локаль: Россия
Результат: Все хорошо!
Спасибо!
спасибо. помогло!
Большое спасибо! в настройках везде стояло Русский, но шрифты в программе были в вопросиках. В региональных настройках выставил Татарский(русский)И шрифты появились. Вернул на обычный русский и все ровно все ок!
thanks!!!
на сайте по всюду знаки вопроса, как в исходном коде декодировать на кириллицу? manuals4you.narod.ru/
Евгений, судя по тому, что код символов у этих знаков вопросов одинаков — уже никак. Если вдруг найдете методы, то поделитесь, пожалуйста =)
Спасибо! Помогло!
Спасибо, получилось!!!
Все получилось. Но, буквально через 5 минут опять вопросы. Что это может быть? А получилось после того как поменяла на английский и обратно. Через реестр вообще ничего не произошло. Это происходит на одном сайте. Подскажите, что можно еще сделать.
1)работаю delphi 7. Dbexpress (sqlconnect и sqlquery). установил sqlite драйвер для работы с базой данных.
2)при обращении в БД запросом, вместо русского текста возвращает знаки вопроса. При записи в БД через delphi русского текста, он сохраняется кракозябрами в бд, но считывается нормально обратно.
3) ни один из способов не помог.
помогло преобразование типов в самом запросе! cast (name as blob) name (был text, стал blob). Удобно, но пока есть проблемы со случаями наличия в русском тесте чисел (русские буквы пропадают).
реальное огромное спасибо за помощь. сам врядли мы дошел до этого.
Только «странным» методом и удалось заставить показывать текст программу с сайта gosuslugi.ru, программисты с которого в 2016 году почему-то выкладывают для общего обязательного пользования программы, написанные на кривом Дельфи.
проблема известная, сам я её решал таким образом:
внутри System::initialization(void) есть вызов GetThreadLocale
перед этим проверяют версию системы (полученную от GetVersion)
и там ставят кодовую страницу 3, которую надо заменить на 0
(предполагаю что это CP_THREAD_ACP которое заменяется на CP_ACP)
в результате программа начинает работать правильно выводя все строки
ещё иногда приходится заменять в ресурсах DEFAULT_CHARSET на RUSSIAN_CHARSET
обратите внимание на «CODE:0040653C», вот это оно и есть.
CODE:004064A0 ; _DWORD __cdecl System::initialization()
CODE:004064A0 __fastcall System::initialization(void) proc near
CODE:004064A0 sub ds:dword_4945B8, 1
CODE:004064A7 jnb locret_406572
CODE:004064AD mov ds:byte_492008, 2
CODE:004064B4 mov ds:dword_494014, offset loc_40122C
CODE:004064BE mov ds:dword_494018, offset loc_40123C
CODE:004064C8 mov ds:byte_49404A, 2
CODE:004064CF mov ds:dword_494000, offset loc_4053EC
CODE:004064D9 call unknown_libname_51 ; BDS 2005-2007 and Delphi6-7 Visual Component Library
CODE:004064DE test al, al
CODE:004064E0 jz short loc_4064E7
CODE:004064E2 call unknown_libname_52 ; BDS 2005-2007 and Delphi6-7 Visual Component Library
CODE:004064E7
CODE:004064E7 loc_4064E7: ; CODE XREF: System::initialization(void)+40j
CODE:004064E7 call unknown_libname_53 ; BDS 2005-2007 and Delphi6-7 Visual Component Library
CODE:004064EC mov ds:word_494050, 0D7B0h
CODE:004064F5 mov ds:word_49421C, 0D7B0h
CODE:004064FE mov ds:word_4943E8, 0D7B0h
CODE:00406507 call GetCommandLineA
CODE:0040650C mov ds:dword_49403C, eax
CODE:00406511 call unknown_libname_12 ; BDS 2005-2007 and Delphi6-7 Visual Component Library
CODE:00406516 mov ds:dword_494038, eax
CODE:0040651B call GetVersion
CODE:00406520 and eax, 80000000h
CODE:00406525 cmp eax, 80000000h
CODE:0040652A jz short loc_406559
CODE:0040652C call GetVersion
CODE:00406531 and eax, 0FFh
CODE:00406536 cmp ax, 4
CODE:0040653A jbe short loc_406548
CODE:0040653C mov ds:CodePage, 3 ; 0
CODE:00406546 jmp short loc_406568
CODE:00406548 ; —————————————————————————
CODE:00406548
CODE:00406548 loc_406548: ; CODE XREF: System::initialization(void)+9Aj
CODE:00406548 call GetThreadLocale
CODE:0040654D call unknown_libname_100 ; BDS 2005-2007 and Delphi6-7 Visual Component Library
CODE:00406552 mov ds:CodePage, eax
CODE:00406557 jmp short loc_406568
CODE:00406559 ; —————————————————————————
CODE:00406559
CODE:00406559 loc_406559: ; CODE XREF: System::initialization(void)+8Aj
CODE:00406559 call GetThreadLocale
CODE:0040655E call unknown_libname_100 ; BDS 2005-2007 and Delphi6-7 Visual Component Library
CODE:00406563 mov ds:CodePage, eax
CODE:00406568
CODE:00406568 loc_406568: ; CODE XREF: System::initialization(void)+A6j
CODE:00406568 ; System::initialization(void)+B7j
CODE:00406568 call GetCurrentThreadId
CODE:0040656D mov ds:dword_494030, eax
CODE:00406572
CODE:00406572 locret_406572: ; CODE XREF: System::initialization(void)+7j
CODE:00406572 retn
CODE:00406572 __fastcall System::initialization(void) endp
CODE:00406572
CODE:00406572 ; —————————————————————————
CODE:00406573 align 4
CODE:00406574 ; [00000006 BYTES: COLLAPSED FUNCTION GetModuleHandleA_0]
CODE:0040657A align 4
CODE:0040657C ; [00000006 BYTES: COLLAPSED FUNCTION LocalAlloc_0]
CODE:00406582 align 4
CODE:00406584 ; [00000006 BYTES: COLLAPSED FUNCTION TlsGetValue]
CODE:0040658A align 4
CODE:0040658C ; [00000006 BYTES: COLLAPSED FUNCTION TlsSetValue]
CODE:00406592 align 4
На всякий случай вот это же место с сигнатурами (чтобы можно было попасть поиском сразу куда надо и пропатчить, место .0040653C уже изменено с 3 на 0):
.0040651B: E834AEFFFF call GetVersion — 8
.00406520: 2500000080 and eax,080000000 ;’ ‘
.00406525: 3D00000080 cmp eax,080000000 ;’ ‘
.0040652A: 742D jz .000406559 — 9
.0040652C: E823AEFFFF call GetVersion — 8
.00406531: 25FF000000 and eax,0000000FF ;’ ‘
.00406536: 6683F804 cmp ax,4
.0040653A: 760C jbe .000406548 — A
.0040653C: C705BC45490000000000 mov d,[0004945BC],0 ; was 3
.00406546: EB20 jmps .000406568 — B
.00406548: E87FADFFFF Acall GetThreadLocale — C
.0040654D: E886FEFFFF call .0004063D8 — D
.00406552: A3BC454900 mov [0004945BC],eax
.00406557: EB0F jmps .000406568 — B
.00406559: E86EADFFFF 9call GetThreadLocale — C
.0040655E: E875FEFFFF call .0004063D8 — D
.00406563: A3BC454900 mov [0004945BC],eax
.00406568: E8DFADFFFF Bcall GetCurrentThreadId — E
.0040656D: A330404900 mov [000494030],eax
.00406572: C3 retn ; -^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-
Невероятнейшее преогромнейшее благодарю автору!
А проблема эта, просто невероятнейший дебилизм, не знаю чей…
Недооценённая статья.
Как правило, советуют только выставить язык системы и заменить ключи реестра.
Спасибо большое!
Всё помогло я просто поменял всё на английский регион и язык и всё получилось спасибо вам!!!
Благодарю. Автор, Вы крупно помогли. Поменял формат на русский и в редакторах Html появились русские символы!
Благодарю. Автор, Вы крупно помогли. Поменял формат на русский и в редакторах Html появились русские символы!
Нереально благодарен. Перепробовал кучу reg файлов, пересмотрел тонну роликов — а вот твоя статья выручила! Спасибо!
Мне помогло вот это, win7 x64 ENG
(Странно, но проблему решит другая настройка: Панель Управления->Язык и национальные стандарты->Региональные параметры». Эта вкладка отвечает за формат денежных единиц, чисел, дат и времени. И вроде бы не имеет отношения к кодировкам.)