输出utf-8到控制台

时间:2013-05-06 15:54:55

标签: 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", u16); //(2)

(1)产生正确的输出''',而(2)的输出是替换字符U + FFFD。我尝试将stdout(2)重定向到一个文件以查看编码转换是否存在问题,但它产生与utf8_b []相同的字节序列。

任何人都可以向我解释为什么会这样吗?这是一个Windows问题吗?

不过,我的控制台字体已经设置为Consolas。

编辑:我在使用(2)之前评论(1),所以我认为它与流方向无关。 我在某处看到,Windows代码页65001中的一些实现错误会影响C标准IO。任何人都可以为我确认一下吗?

1 个答案:

答案 0 :(得分:0)

在同一FILE流上混合宽字节输出会调用未定义的行为。您应该尝试使用printf("%lc", u16);或取消所有面向字节的输出。