AllocConsole();
consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
WriteConsoleW(consoleHandle, L"qweąęėšų\n", 9, NULL, NULL);
_wfreopen(L"CONOUT$", L"w", stdout);
wprintf(L"qweąęėšų\n");
输出是:
qweąęėšų qwe
为什么wprintf在打印后会停止qwe? \ _中遇到的0字节应该终止宽字符串,AFAIK
答案 0 :(得分:2)
起初我接受了Hans Passant的回答,但是wprintf没有打印到UTF-8流的根本原因是wprintf表现得好像它使用了wcrtomb函数,它将宽字符(wchar_t)编码为多字节序列,具体取决于在当前区域设置 - link。 Windows没有支持UTF-8的语言环境(支持UTF-8代码页的语言环境(65001))。
引自MSDN:
可用区域设置名称,语言,国家/地区代码和代码页的集合包括Windows NLS API支持的所有内容,除了每个字符需要两个以上字节的代码页,例如UTF-7和UTF-8
答案 1 :(得分:1)
stdout流可以重定向,因此始终以8位模式运行。传递给wprintf()的Unicode字符串从utf-16转换为为控制台选择的8位代码页。默认情况下,这是旧的437 OEM代码页。这就是降压停止的地方,代码页不支持该角色。
您需要切换到另一个支持该字符的8位代码页。一个不错的选择是65001,utf-8的代码页。修正:
SetConsoleOutputCP(CP_UTF8);
如果您希望stdin也使用utf-8,请使用SetConsoleCP()。