You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,提问作者吴慈霆

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 12:58:09