我有这个代码来打印一个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。任何人都可以为我确认一下吗?
答案 0 :(得分:0)
在同一FILE流上混合宽字节输出会调用未定义的行为。您应该尝试使用printf("%lc", u16);
或取消所有面向字节的输出。