4
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

为什么在打印 qwe 后 wprintf 停止?\0 遇到的字节应该终止宽字符字符串,AFAIK

4

2 回答 2

2

起初我接受了 Hans Passant 的回答,但 wprintf 不打印到 UTF-8 流的根本原因是 wprintf 的行为就像它使用函数 wcrtomb 一样,该函数将宽字符 (wchar_t) 编码为多字节序列,具体取决于当前语言环境-链接。Windows 没有支持 UTF-8 的语言环境(支持 UTF-8 代码页 (65001) 的语言环境)。

引用MSDN

可用的区域设置名称、语言、国家/地区代码和代码页集包括 Windows NLS API 支持的所有内容,但每个字符需要两个以上字节的代码页除外,例如 UTF-7 和 UTF-8。

于 2013-04-09T09:35:15.160 回答
1

标准输出流可以重定向,因此始终以 8 位模式运行。传递给 wprintf() 的 Unicode 字符串从 utf-16 转换为为控制台选择的 8 位代码页。默认情况下,这是旧的 437 OEM 代码页。这就是降压停止的地方,该代码页不支持该字符。

您需要切换到另一个支持该字符的 8 位代码页。一个不错的选择是 65001,即 utf-8 的代码页。使固定:

 SetConsoleOutputCP(CP_UTF8);

或者,如果您希望标准输入也使用 utf-8,请使用 SetConsoleCP()。

于 2013-04-05T08:05:29.110 回答