Как мне вывести русский язык с помощью 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 шт):

Автор решения: LShadow77

Подвох при вводе русскоязычного текста заключается в том, что консоль по умолчанию имеет кодировку 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.

→ Ссылка
Автор решения: PRODIGY

В некоторых случаях мало изменить кодировку консоли через SetConsoleCP(1251), нужно поменять ещё и шрифт, чтобы он поддерживал кириллицу, типа "LucidaConsole".

→ Ссылка