none
В некоторых местах формы кракозябры вместо кириллицы RRS feed

  • Вопрос

  • Добрый день. Есть исходники программы под Visual Studio 2010. Понадобилось русифицировать - перевёл текст на формах, в коде где строки встречаются тоже всё перевёл. Вроде всё заработало нормально, но в одном месте есть CComboBox и в нём вместо кириллицы отображаются кракозябры. Причём если его "раскрыть" - внутри всё нормально.
    char text[] = "Русский";
    AfxMessageBox(text); // в окне видно русский текст
     
    CComboBox* pCombo = (CComboBox*)GetDlgItem(IDC_COMBO21);
    pCombo->AddString("Английский");
    pCombo->AddString(text);

    <Здесь должны была быть картинка, но мне не разрешили её вставить...>
    Из-за чего такое может быть - что где-то кириллица отображается нормально, а где-то неправильно? Ранее я с Visual С++ не работал ни разу, может что-то неправильно делаю?
    28 января 2018 г. 20:26

Все ответы

  • Убедитесь что ваше приложение использует Unicode (/D "UNICODE" в строке компилятора), замените все 8 битные строки на 16 битные (WCHAR вместо char), все строковые константы снабдите префиксом L"".


    This posting is provided "AS IS" with no warranties, and confers no rights.

    29 января 2018 г. 2:42
    Модератор
  • Включил UNICODE. В коде около 200 объявлений char, даже после их замены на WCHAR осталось 300 ошибок компиляции :(  Я могу потратить время, найти все строки и добавить к ним L"", но в коде есть ещё много вызовов сторонних библиотек, которые принимают char и *char. Нужно будет ещё в этих местах приведение типов сделать (как, кстати?), что ничего не сломал, пока правки вносил. Я всё это смогу сделать, но это 100% поможет? Просто если проблема с кодировкой, то почему она затрагивает только CComboBox (точнее даже его часть)?
    29 января 2018 г. 3:22
  • Если только в одном элементе, в шрифте дело наверное.
    29 января 2018 г. 3:29
  • Если все правильно сделать, то точно поможет. Причем приложение будет после этого работать с любыми языками.

    Однако при наличии библиотек которые работают только с 8 битными символами приложение все равно останется прикованным к станице ANSI для наследственных приложений. Тут придется делать не приведение, а перекодировку строк:

    https://msdn.microsoft.com/en-us/library/windows/desktop/dd318026(v=vs.85).aspx

    Что до проблем в определенных местах, то скорее всего в разных местах разные кодировки. Это была большая проблема до появления Unicode. 

    Другие варианты:

    - Шрифт в отдельных местах без нужных символов (обычно выглядит квадратиками)

    - Кодовая страница ANSI для ОС не совпадает с той что используется приложением. Часто символы заменяются знаками вопроса, но возможны варианты.

    Проверьте настройки кодовой страницы для неюникодных программ в ОС (Control Panel/Region/Administrative/Change System Locale. 

    Можно так же вызвать GetACP(). Дальше проверьте что все строки в программе представлены в этой кодовой странице. Это можно посмотреть в отладчике по кодам символов.

    Наверное не повредит создать пустое приложение с одним лишь комбо боксом и посмотреть как он работает с UNICODE.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    29 января 2018 г. 4:01
    Модератор