C 输出utf-8到控制台

C 输出utf-8到控制台,c,windows,encoding,stdout,C,Windows,Encoding,Stdout,我有以下代码可以将utf-8字符打印到windows控制台: SetConsoleOutputCP(65001); freopen(NULL, "w,ccs=UTF-8", stdout); wchar_t u16 = 0x00A9; unsigned char utf8_b[] = {0xc2, 0xa9, 0x0}; //same as using WideCharToMultibyte for u16 printf("%s", utf8_b); //(1) wprintf(L"%c",

我有以下代码可以将utf-8字符打印到windows控制台:

SetConsoleOutputCP(65001);
freopen(NULL, "w,ccs=UTF-8", stdout);

wchar_t u16 = 0x00A9;
unsigned char utf8_b[] = {0xc2, 0xa9, 0x0}; //same as using WideCharToMultibyte for u16
printf("%s", utf8_b); //(1)
wprintf(L"%c", u16); //(2)
(1) 生成正确的输出,即“)”,而(2)的输出是替换字符U+FFFD。我尝试将stdout(2)重定向到一个文件,以查看编码转换是否有问题,但它生成的字节序列与utf8_b[]相同

谁能解释一下为什么会这样?这是windows的问题吗

顺便说一句,我的控制台字体已设置为ConsoleAs

编辑:我在使用(2)之前评论(1),所以我认为它与这里的流方向无关。
我在某个地方读到,windows代码页65001中的一些实现错误可能会影响C标准IO。有人能帮我确认一下吗?

在同一文件流上混合宽范围和面向字节的输出会调用未定义的行为。您应该尝试使用
printf(“%lc”,u16)或消除所有面向字节的输出。

怎么样?@Kninnug与(2)=的结果相同。=这对我来说根本不需要重新编程。这是什么版本的VS?