WriteConsoleW,wprintf和Unicode

时间:2013-04-05 06:51:08

标签: windows unicode console

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

2 个答案:

答案 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()。