繁体   English   中英

简单的C程序没有给出预期的输出

[英]Simple C Program does not give Expected Output

我正在编写一个小程序,该程序应该在屏幕上显示☻字符。 该程序在下面列出:

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

但是,当我运行该程序时,我得到的输出

Γÿ║

为什么要获得此输出,我应该怎么做才能获得所需的输出?

之所以会这样,是因为您使用的任何终端程序与某些Unicode编码都不兼容。

例如,我的Debian盒子可以很好地编译,并且实际上可以打印出笑脸,因为gnome-terminal是该死的精致软件:-)

您看到的是三个字符而不是一个字符,这实际上很好地表明了它正在输出UTF-8。 实际上,如果我在Debian机器上运行该程序并使用od -xcb捕获二进制输出, 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

并且, 在这里使用这个出色的答案,指出以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 ,这完全是巧合,是黑色笑脸字符


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

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

您可能想看一下这个问题 ,特别是有关使用chcp将代码页更改为65001(UTF-8)的答案。 注意我还没有测试过,我只是为您提供一个指针。

#include <fcntl.h>

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

瓦尔特

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM