我正在写一个小程序,它应该在屏幕上显示一个☻字符。该计划如下:
#include <stdio.h>
main()
{
printf("☻\n");
}
然而,当我运行这个程序时,我得到了
的输出Γÿ║
为什么我得到这个输出,我该怎么做才能得到我想要的输出?
答案 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");
瓦尔特