Знаки вопроса вместо русских букв, кракозябры или неверная кодировка

Как это не странно, но во времена 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”

Понравилось? =) Поделись с друзьями:

Обсуждение записи “Знаки вопроса вместо русских букв, кракозябры или неверная кодировка”

  1. Рамиль says:

    Огромное спасибо! Выручили)))

  2. Александр says:

    Отлично! Нужно было переделать другу какой-то проэкт в Delphi 7 —

    Формат: Россия
    Локаль: Россия
    Результат: Все хорошо!

    Спасибо!

  3. psd says:

    спасибо. помогло!

  4. sz says:

    Большое спасибо! в настройках везде стояло Русский, но шрифты в программе были в вопросиках. В региональных настройках выставил Татарский(русский)И шрифты появились. Вернул на обычный русский и все ровно все ок!

  5. thanks thanks says:

    thanks!!!

  6. Евгений (manuals4you.narod.ru) says:

    на сайте по всюду знаки вопроса, как в исходном коде декодировать на кириллицу? manuals4you.narod.ru/

  7. Владимир Демянович (elims.org.ua) says:

    Евгений, судя по тому, что код символов у этих знаков вопросов одинаков — уже никак. Если вдруг найдете методы, то поделитесь, пожалуйста =)

  8. Анна Иванова says:

    Спасибо! Помогло!

  9. nina says:

    Спасибо, получилось!!!

  10. nina says:

    Все получилось. Но, буквально через 5 минут опять вопросы. Что это может быть? А получилось после того как поменяла на английский и обратно. Через реестр вообще ничего не произошло. Это происходит на одном сайте. Подскажите, что можно еще сделать.

  11. Сергей says:

    1)работаю delphi 7. Dbexpress (sqlconnect и sqlquery). установил sqlite драйвер для работы с базой данных.
    2)при обращении в БД запросом, вместо русского текста возвращает знаки вопроса. При записи в БД через delphi русского текста, он сохраняется кракозябрами в бд, но считывается нормально обратно.
    3) ни один из способов не помог.

  12. Сергей says:

    помогло преобразование типов в самом запросе! cast (name as blob) name (был text, стал blob). Удобно, но пока есть проблемы со случаями наличия в русском тесте чисел (русские буквы пропадают).

  13. Дмитрий says:

    реальное огромное спасибо за помощь. сам врядли мы дошел до этого.

  14. Vit says:

    Только «странным» методом и удалось заставить показывать текст программу с сайта gosuslugi.ru, программисты с которого в 2016 году почему-то выкладывают для общего обязательного пользования программы, написанные на кривом Дельфи.

  15. SadSdaf says:

    проблема известная, сам я её решал таким образом:
    внутри 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

  16. SadSdaf says:

    На всякий случай вот это же место с сигнатурами (чтобы можно было попасть поиском сразу куда надо и пропатчить, место .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 ; -^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-

  17. Сергей says:

    Невероятнейшее преогромнейшее благодарю автору!
    А проблема эта, просто невероятнейший дебилизм, не знаю чей…

  18. Vitaly says:

    Недооценённая статья.
    Как правило, советуют только выставить язык системы и заменить ключи реестра.

  19. Андрей says:

    Спасибо большое!

  20. Dezert_Many says:

    Всё помогло я просто поменял всё на английский регион и язык и всё получилось спасибо вам!!!

  21. Эдвард says:

    Благодарю. Автор, Вы крупно помогли. Поменял формат на русский и в редакторах Html появились русские символы!

Обсудить