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