我正在写一个小程序,它应该在屏幕上显示一个☻字符.该计划如下:
#include <stdio.h>
main()
{
printf("?\n");
}
Run Code Online (Sandbox Code Playgroud)
但是,当我运行这个程序时,我得到了输出
?ÿ?
Run Code Online (Sandbox Code Playgroud)
为什么我得到这个输出,我该怎么做才能得到我想要的输出?
你得到的是因为你使用的终端程序与某些Unicode编码不兼容.
例如,我的Debian框编译得很好,它实际上打印出笑脸,因为gnome-terminal是一个该死的精美软件:-)
你看到三个字符而不是一个字符的事实是一个相当好的迹象表明它正在输出UTF-8.事实上,如果我在Debian盒子上运行该程序并捕获二进制输出od -xcb,我看到:
0000000 98e2 0abb
342 230 273 \n
342 230 273 012
0000004
Run Code Online (Sandbox Code Playgroud)
显示它是以 UTF-8出现的,它只是gnome-terminal足够聪明,可以将其转换回正确的字形.
这些字节转换为二进制,如下所示:
e2 98 bb
1110 0010 : 1001 1000 : 1011 1011
Run Code Online (Sandbox Code Playgroud)
并且,在这里使用这个优秀的答案,声明开始的位模式10是连续字节,我们可以解码它如下:
U+000800-U+00ffff 1110yyyy yyyyyyyy xxxxxxxx
10yyyyxx
10xxxxxx
e2 98 bb
1110 0010 : 1001 1000 : 1011 1011
yyyy yy yyxx xx xxxx
Run Code Online (Sandbox Code Playgroud)
因此,代码点0010 0110 : 0011 1011等于263b完全没有重合的是黑色笑脸字符.
在修复Windows无法正确显示Unicode的问题方面,如您的评论所示:
我在Windows命令提示符下.我应该如何让cmd.exe与unicode一起使用?
您可能希望查看此问题,尤其是关于使用chcp将代码页更改为65001(UTF-8)的答案.注意我没有测试过这个,我只提供它作为指针.
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |