Windows WriteConsoleW、wprintf和Unicode

Windows WriteConsoleW、wprintf和Unicode,windows,unicode,console,Windows,Unicode,Console,输出为: 为什么打印qwe后wprintf停止\ą中遇到的0字节应终止宽字符字符串,AFAIK标准输出流可以重定向,因此始终以8位模式运行。传递给wprintf()的Unicode字符串将从utf-16转换为为为控制台选择的8位代码页。默认情况下,这是旧的437 OEM代码页。这就是责任所在,代码页不支持字符 您需要切换到另一个8位代码页,一个支持该字符的页。一个好的选择是65001,utf-8的代码页。修正: qweąęėšų qwe 如果您希望stdin也使用utf-8,也可以使用SetC

输出为:


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

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

您需要切换到另一个8位代码页,一个支持该字符的页。一个好的选择是65001,utf-8的代码页。修正:

qweąęėšų
qwe

如果您希望stdin也使用utf-8,也可以使用SetConsoleCP()。

起初我接受了Hans Passant的答案,但wprintf没有打印到utf-8流的根本原因是wprintf的行为就像它使用函数wcrtomb一样,该函数根据当前的语言环境将宽字符(wchar\u t)编码为多字节序列。 Windows没有支持UTF-8的区域设置(支持UTF-8代码页(65001)的区域设置)

引自:

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


因此,在这种情况下,Microsoft C runtime似乎不兼容,因为标准输出应该使用最先使用的模式定向。注意:您可以使用
\u setmode(\u fileno(标准输出),\u O\u U16TEXT)
(或
\u O\u U8TEXT
),使用
wprintf()
打印Unicode,尽管它会中断
printf
qweąęėšų
qwe
 SetConsoleOutputCP(CP_UTF8);