Я пытаюсь написать строки Unicode на экран в C++ в Windows. Я изменил свой консольный шрифт для Lucida Console
и я поставил вывод CP_UTF8
ака 65001.Проблемы Unicode в C++, но не C
я запускаю следующий код:
#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
и НЕ cstdio
.
Любые идеи, как я могу использовать std::cout
? Как я могу использовать cstdio
? Почему это происходит? Это не cstdio
только версия C++ 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
: л
Так что вопрос все еще стоит ..
Что делать, если вы используете 'std :: printf', когда включаете' cstdio'? –
Он печатает те же плохие символы. Никакой разницы с или без 'std ::' я использую Mingw 4.8.1. Самая последняя сборка. – Brandon
Что говорит '' говорят, что это выводит? –