[英]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.