Windows终端中如何正确打印"\xc9"?C语言遇编码问题
C语言Windows终端打印特殊字符异常,Python正常的问题解析
我用C语言向Windows终端打印特殊字符(对应十六进制0xC9的É)时,输出结果是问号,但用Python却能正常显示,推测这和编码设置有关。
C语言代码及运行结果
#include<stdio.h> const char *a = "\xc9"; int main(){ printf("%s\n", a); }
编译及运行输出:
PS C:\Users\xxx> gcc a.c -o a.exe PS C:\Users\xxx> .\a.exe ?
Python代码及运行结果
a = 0xc9 print(chr(a))
运行输出:
PS C:\Users\xxx> python a.py É
问题原因
Windows终端默认使用GBK类编码(比如代码页936),C语言中直接输出的\xc9是单个字节,这个字节在GBK编码里不属于有效字符,终端无法解析,因此显示为问号。
而Python的chr(0xc9)生成的是Unicode字符U+00C9(É),Python会自动根据终端当前编码完成转换输出——不管终端用UTF-8还是GBK,都能输出对应编码的字节序列,所以可以正常显示。
解决方法
设置终端为UTF-8编码并输出对应字节:
通过Windows API将控制台输出编码设为UTF-8(代码页65001),再输出É对应的UTF-8编码(0xC3 0x89):#include <stdio.h> #include <windows.h> int main(){ SetConsoleOutputCP(65001); const char *a = "\xc3\x89"; printf("%s\n", a); return 0; }使用宽字符输出Unicode字符:
用宽字符类型存储Unicode字符,配合宽字符打印函数输出:#include <stdio.h> #include <wchar.h> #include <windows.h> int main(){ SetConsoleOutputCP(65001); wchar_t a = L'\u00C9'; wprintf(L"%lc\n", a); return 0; }适配终端默认GBK编码:
如果保持终端默认GBK编码,直接输出É对应的GBK字节(0x82 0x63):#include<stdio.h> const char *a = "\x82\x63"; int main(){ printf("%s\n", a); }
内容的提问来源于stack exchange,提问作者吴慈霆
相关产品推荐
相关产品推荐

