Как показать кириллический текст в многобайтовом приложении MFC?

Я новичок в C++ и MFC. Основная проблема в том, что у меня есть проект МФЦ, который нужно перевести на русский язык. Я вижу, что лучше всего изменить проект на Unicode, но я не могу, потому что это огромный проект, и когда я меняюсь, я получаю более 4000 ошибок. Позже мы передадим весь код в Unicode, но сейчас мне просто нужно показать кириллицу на кнопках и CListBox.

Ну, а главное: как напечатать кириллицу с помощью многобайтовых символов?

Спасибо, парни!

PD: Извините, я собираюсь быть более ясным с тем, что я пытался:

Используйте русские локали:

setlocale(LC_ALL, "russian_russia.1251");
setlocale(LC_CTYPE, "rus");

Но не сработало. Показывает вопросительные знаки.

Также я пытался конвертировать с функцией WideCharToMultiByte. Но показывает символы, которые, кажется, закодированы неправильно.

std::string utf8_encode(const std::wstring &wstr)
{
    if (wstr.empty()) return std::string();
    int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
    std::string strTo(size_needed, 0);
    WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
    return strTo;
}

    wchar_t* wch = L"Привет";

    std::string ch = utf8_encode(wch);

    m_wndOutputBuild.AddString(ch.c_str()); //OUTPUT Привет

PD2: Теперь я звоню вот так

setlocale(LC_ALL, "russian_russia.1251");

std::wstring wch = L"Привет";

std::string ch = encode_1251(wch);

m_wndOutputBuild.AddString(ch.c_str()); //OUTPUT Ïðèâåò

и функция:

std::string encode_1251(const std::wstring &wstr)
{
    if (wstr.empty()) return std::string();
    int size_needed = WideCharToMultiByte(1251, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
    std::string strTo(size_needed, 0);
    WideCharToMultiByte(1251, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
    return strTo;
}

Я обнаружил, что Windows-1251 помещает CP вот так на WideCharToMultiByte здесь.

1 ответ

В вашем utf8_encode функция, при преобразовании вашей строки Unicode UTF-16 в std::string, вы прошли CP_UTF8 в WideCharToMultiByte, Затем вы берете возвращенный UTF-8 std::stringи передать его через .c_str() к CListBox::AddString метод.

Однако, если ваше приложение использует кириллицу MBCS, вы должны преобразовать из UTF-16 в свою кодовую страницу кириллицы вместо UTF-8 и передать строки, закодированные в вашей кодовой странице кириллицы, в методы класса MFC, например CListBox::AddString,

Другими словами, вы можете заменить utf8_encode функция с cyrillic_encode функция, которая принимает текст UTF-16 в качестве входных данных и преобразует его в вашу кодовую страницу кириллицы:

// Convert from Unicode UTF-16 to Cyrillic code page
std::string cyrillic_encode(const std::wstring &utf16)

А затем передайте возвращенную строку интересующим методам класса MFC, например:

// From Unicode UTF-16 to Cyrillic code page
std::string cyrillic_text = cyrillic_encode(wch);

// Show Cyrillic-encoded "MBCS" text
m_wndOutputBuild.AddString(cyrillic_text.c_str());

Более того, как правильно указал @IInspectable в комментариях, рассмотрите возможность добавления правильного кода проверки ошибок в ваши функции преобразования. Фактически, в общем, может быть текст UTF-16, который не может быть должным образом закодирован кириллицей, поскольку последний является надлежащим подмножеством первого.

Другие вопросы по тегам