0

我有这段代码可以将 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。谁能帮我确认一下?

4

1 回答 1

0

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

于 2013-05-06T17:41:34.883 回答