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字节应该终止宽stringAFAIK
标准输出流可以重定向,因此始终以8位模式运行。 传递给wprintf()的Unicode字符串将从utf-16转换为为控制台选择的8位代码页。 默认情况下,这是旧的437 OEM代码页。 这是降压停止的地方,代码页不支持字符。
您需要切换到另一个支持该字符的8位代码页。 一个不错的选择是65001,utf-8的代码页。 固定:
SetConsoleOutputCP(CP_UTF8);
或者如果你想让stdin使用utf-8,也可以使用SetConsoleCP()。
起初,我接受Hans Passant的回答,但是wprintf不打印到UTF-8流的根本原因在于wprintf的行为就像使用wcrtomb函数一样,wcrtomb将宽字符(wchar_t)编码为多字节序列,具体取决于当前区域设置 – 链接 。 Windows没有支持UTF-8的语言环境(支持UTF-8代码页(65001)的语言环境)。
从MSDN引用:
除了需要每个字符超过两个字节的代码页(例如UTF-7和UTF-8)之外,可用语言环境名称,语言,国家/地区代码和代码页的集合包括Windows NLS API支持的所有内容。