简单C程序不提供预期输出

时间:2014-03-19 02:05:38

标签: c

我正在写一个小程序,它应该在屏幕上显示一个☻字符。该计划如下:

#include <stdio.h>
main()
{
    printf("☻\n");
}

然而,当我运行这个程序时,我得到了

的输出
Γÿ║

为什么我得到这个输出,我该怎么做才能得到我想要的输出?

2 个答案:

答案 0 :(得分:5)

您正在使用它,因为您使用的任何终端程序都不兼容某些Unicode编码。

例如,我的Debian框编译得很好,它实际上打印出笑脸,因为gnome-terminal是一个该死的软件: - )

你看到三个字符而不是一个字符的事实是一个相当好的迹象表明它输出了UTF-8。事实上,如果我在Debian框中运行该程序并使用od -xcb捕获二进制输出,我看到:

0000000    98e2    0abb
        342 230 273  \n
        342 230 273 012
0000004

显示 以UTF-8形式出现,只是gnome-terminal足够聪明,可以将其转换回正确的字形。

这些字节转换为二进制,如下所示:

e2          98          bb
1110 0010 : 1001 1000 : 1011 1011

并且,使用这个出色的答案here,声明以10开头的位模式是连续字节,我们可以按如下方式对其进行解码:

U+000800-U+00ffff  1110yyyy  yyyyyyyy xxxxxxxx
                   10yyyyxx
                   10xxxxxx

e2          98          bb
1110 0010 : 1001 1000 : 1011 1011
     yyyy     yy yyxx     xx xxxx

因此,代码点为0010 0110 : 0011 1011,相当于263b,完全没有巧合,是black smiling face character


在修复Windows无法正确显示Unicode的问题方面,如评论所示:

  

我在Windows命令提示符下。我应该如何使cmd.exe与unicode一起使用?

您可能需要查看this question,尤其是关于使用chcp将代码页更改为65001(UTF-8)的答案。注意我还没有测试过这个,我只提供它作为指针。

答案 1 :(得分:1)

#include <fcntl.h>

_setmode(_fileno(stdout), _O_U16TEXT);
wprintf(L"☻\n");

瓦尔特