Как мне вывести русский язык с помощью MessageBox
Пытаюсь вызвать MessageBox функцию Win32 , но она отображает иероглифы.
Аргументы:
NULL, (LPCSTR)Line.c_str(), (LPCSTR)Line.c_str(), NULL
Но самое главное, я заметил баг что ли:
1)Если я создам строку вот так: string Line = "Hello" - она будет отображаться как надо!!!
2)Если создам строку так: string Line; cin >> Line; - отображаются иероглифы!!!
В чем подвох? Пожалуйста, решите или предложите что-нибудь !!!
string Line = "Nice bro!!!";
MessageBoxA(NULL, (LPCSTR)Line.c_str() , (LPCSTR)Line.c_str(), NULL); // работает
string Line;
cin >> Line;
MessageBoxA(NULL, (LPCSTR)Line.c_str() , (LPCSTR)Line.c_str(), NULL); // не работает
Ответы (2 шт):
Подвох при вводе русскоязычного текста заключается в том, что консоль по умолчанию имеет кодировку DOS (cp866), а MessageBoxA() выводит текст в кодировке Windows (cp1251). Путей решения как минимум три.
Путь 1. Перед вводом с консоли измените её кодировку, например сделав вызов SetConsoleCP(1251):
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
int main()
{
string Line = "Nice bro!!!";
MessageBoxA(NULL, (LPCSTR)Line.c_str() , (LPCSTR)Line.c_str(), MB_OK | MB_ICONINFORMATION); // работает
SetConsoleCP(1251);
cin >> Line;
MessageBoxA(NULL, (LPCSTR)Line.c_str() , (LPCSTR)Line.c_str(), MB_OK | MB_ICONINFORMATION); // тоже работает
return 0;
}
Путь 2. После ввода с консоли преобразовать строку в кодировку 1251, вызвав функцию OemToCharA() (см. https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-oemtochara).
Путь 3. Работать со строками UNICODE.
P.S. Последний параметр MessageBox() не NULL, а 0. А ещё лучше что-нибудь вроде MB_OK | MB_ICONINFORMATION.
В некоторых случаях мало изменить кодировку консоли через SetConsoleCP(1251), нужно поменять ещё и шрифт, чтобы он поддерживал кириллицу, типа "LucidaConsole".