我在Windows控制台程序中遇到一个简单的问题。我用C ++编写了以下单文件(UTF-8编码)程序:
// utf8 source file encoding
#include <iostream>
#include <iomanip>
int main() {
// compile and run on windows 10 and change code page to utf
// execute from cmd.exe
// WHY first letter 'П' - first time not printed? But after space printed?
std::system("chcp 65001>nul");
const char* utf8 = u8"Привет Мир"; // this will skip first letter with MinGW compiler
const char* utf8s = u8" Привет Мир"; // this will print nice!!! Just add space
std::cout << "cout\n";
std::cout << utf8 << std::endl;
std::cout << utf8s << std::endl;
std::cout << utf8 << std::endl;
std::cout << std::flush;
std::wcout << L"wcout\n";
std::wcout << L"Привет Мир" << std::endl;
std::wcout << L" Привет Мир" << std::endl;
std::wcout << L"Привет Мир" << std::endl;
std::wcout << std::flush;
std::printf("printf\n");
std::printf("%s\n", utf8);
std::printf("%s\n", utf8s);
std::printf("wprintf\n");
std::wprintf(L"Привет Мир\n");
std::wprintf(L" Привет Мир\n");
std::wprintf(L"Привет Мир\n");
std::fflush(stdout);
std::system("pause");
return 0;
}
程序的输出在Windows 10中由git-bash.exe运行时是正确的,但在控制台中使用Lucida Console字体由CMD运行时则不正确。即使使用chcp 65001
,它也不会打印俄语“Hello World”(“ПриветМир”)的第一个字母。我尝试使用MinGW 7.1和MSVC 2017编译此代码,但没有任何改变。我知道rustc.exe(Rust Lang编译器)生成的二进制文件在控制台和git-bash.exe中都可以使用UTF-8文本打印。如何在Windows中的C ++程序中完成相同的操作?提前谢谢。