Давайте начнем с того, что мне кажется, что существует просто нет способа вывода текста UTF-8 на консоль в Windows через cout
(при условии, что вы компилируете с Visual Studio).
Однако, что вы можете сделать для своих тестов, это вывести текст UTF-8 через Win32 API fn WriteConsoleA
:
if(!SetConsoleOutputCP(CP_UTF8)) { // 65001
cerr << "Failed to set console output mode!\n";
return 1;
}
HANDLE const consout = GetStdHandle(STD_OUTPUT_HANDLE);
DWORD nNumberOfCharsWritten;
const char* utf8 = "Umlaut AE = \xC3\x84 / ue = \xC3\xBC \n";
if(!WriteConsoleA(consout, utf8, strlen(utf8), &nNumberOfCharsWritten, NULL)) {
DWORD const err = GetLastError();
cerr << "WriteConsole failed with << " << err << "!\n";
return 1;
}
Это должно вывести:
Umlaut AE = Ä / ue = ü
если вы настроили консоль (cmd.exe) на использование шрифта Lucida Console.
Что касается вашего вопроса (взято из вашего комментария), если
Преобразованная строка Win23 API - это
такой же как необработанная строка UTF8 (linux)
Я скажу да: учитывая последовательность символов Unicode, это представление UTF-16 (Windows wchar_t), преобразованное в представление UTF-8 (char) с помощью функции WideCharToMultiByte
, всегда будет приводить к одной и той же последовательности байтов.