为什么控制台不能在Windows 10中打印UTF-8字符串的第一个字母?

时间:2018-01-26 13:16:26

标签: c++ windows utf-8 cmd windows-console

我在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;
}

从CMD运行时Windows控制台中的输出: from cmd.exe

从bash运行时终端输出: from git-bash.exe

程序的输出在Windows 10中由git-bash.exe运行时是正确的,但在控制台中使用Lucida Console字体由CMD运行时则不正确。即使使用chcp 65001,它也不会打印俄语“Hello World”(“ПриветМир”)的第一个字母。我尝试使用MinGW 7.1和M​​SVC 2017编译此代码,但没有任何改变。我知道rustc.exe(Rust Lang编译器)生成的二进制文件在控制台和git-bash.exe中都可以使用UTF-8文本打印。如何在Windows中的C ++程序中完成相同的操作?提前谢谢。

0 个答案:

没有答案