我有这段代码可以将 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的问题吗?
顺便说一句,我的控制台字体已经设置为 Consolas。
编辑:我在使用(2)之前评论(1),所以我认为它与这里的流方向无关。我在某处读到 Windows 代码页 65001 中的一些实现错误会影响 C 标准 IO。谁能帮我确认一下?