Я пытаюсь написать строки unicode на экране в С++ в Windows. Я изменил свой консольный шрифт на Lucida Console
, и я установил вывод на CP_UTF8
aka 65001.
Я запускаю следующий код:
#include <stdio.h> //notice this header file..
#include <windows.h>
#include <iostream>
int main()
{
SetConsoleOutputCP(CP_UTF8);
const char text[] = "Россия";
printf("%s\n", text);
}
Он распечатывается просто отлично!
Однако, если я это сделаю:
#include <cstdio> //the C++ version of the header..
#include <windows.h>
#include <iostream>
int main()
{
SetConsoleOutputCP(CP_UTF8);
const char text[] = "Россия";
printf("%s\n", text);
}
он печатает: ������������
У меня нет понятия, почему..
Другое дело, когда я делаю:
#include <windows.h>
#include <iostream>
int main()
{
std::uint32_t oldcodepage = GetConsoleOutputCP();
SetConsoleOutputCP(CP_UTF8);
std::string text = u8"Россия";
std::cout<<text<<"\n";
SetConsoleOutputCP(oldcodepage);
}
Я получаю тот же вывод, что и выше (нерабочий выход).
Используя printf
на std::string
, он отлично работает, хотя:
#include <stdio.h>
#include <windows.h>
#include <iostream>
int main()
{
std::uint32_t oldcodepage = GetConsoleOutputCP();
SetConsoleOutputCP(CP_UTF8);
std::string text = u8"Россия";
printf("%s\n", text.c_str());
SetConsoleOutputCP(oldcodepage);
}
но только если я использую stdio.h
и NOT cstdio
.
Любые идеи, как я могу использовать std::cout
? Как я могу использовать cstdio
?
Почему это происходит? Не cstdio
просто версия С++ stdio.h
?
EDIT: Я только что попробовал:
#include <iostream>
#include <io.h>
#include <fcntl.h>
int main()
{
_setmode(_fileno(stdout), _O_U8TEXT);
std::wcout << L"Россия" << std::endl;
}
и да, но это работает, но только если я использую std::wcout
и wide strings
. Мне бы очень хотелось избежать wide-strings
, и единственным решением, которое я вижу до сих пор, является C-printf
: l
Итак, вопрос все еще стоит.