WriteConsoleW、wprintf 和 Unicode

use*_*334 5 windows unicode console

AllocConsole();\nconsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);\nWriteConsoleW(consoleHandle, L"qwe\xc4\x85\xc4\x99\xc4\x97\xc5\xa1\xc5\xb3\\n", 9, NULL, NULL);\n_wfreopen(L"CONOUT$", L"w", stdout);\nwprintf(L"qwe\xc4\x85\xc4\x99\xc4\x97\xc5\xa1\xc5\xb3\\n");\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出是:

\n\n
\n
qwe\xc4\x85\xc4\x99\xc4\x97\xc5\xa1\xc5\xb3\nqwe\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

为什么 wprintf 在打印 qwe 后停止?\xc4\x85 中遇到的 \\0 字节应该终止宽字符字符串,据我所知

\n

use*_*334 2

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

引用自MSDN

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

  • 注意:您可以使用“_setmode(_fileno(stdout), _O_U16TEXT);”(或“_O_U8TEXT”),使用“wprintf()”打印 Unicode ——尽管它会破坏“printf”。 (3认同)