Windows平台C程序控制台输出采用的字符集技术咨询
Windows平台C程序控制台输出的字符集问题解析
Windows控制台默认使用的是系统当前代码页(Code Page),这就是你遇到显示差异的核心原因。
你看到'ü'后跟上标2(²),是因为你的控制台大概率用的是CP437(DOS拉丁-US代码页)——在CP437里,十六进制值0xFC对应'ü',而0xFD对应的就是上标2(²);但在你查阅的ISO 8859-1、Unicode里,0xFD对应的是'ý',所以VS调试窗口(使用系统ANSI代码页或直接支持Unicode)能正确显示,而控制台不行。
关于控制台字符集的关键细节:
- 用
chcp命令可以查看/切换当前控制台代码页:- 输入
chcp能看到当前激活的代码页,比如Active code page: 437 - 切换到西欧常用的CP1252代码页,输入
chcp 1252后再运行程序,'ü'后面就会显示'ý'
- 输入
- C程序的默认字符输出,是把字符按当前控制台代码页编码发送。如果你的代码用
char类型存储字符,编译器会按项目的字符集设置(比如多字节字符集)把源文件里的字符转成对应编码;如果用wchar_t和wprintf这类宽字符函数,则会涉及Unicode到控制台代码页的转换。 - 要让控制台稳定显示Unicode字符,有两种实用方法:
- 调用Windows API
SetConsoleOutputCP(CP_UTF8),把控制台输出代码页设为UTF-8,同时确保程序输出UTF-8编码的字符 - 使用宽字符输出函数,配合
SetConsoleOutputCP(CP_UNICODE)(注意部分旧版本控制台可能不支持)
- 调用Windows API
内容的提问来源于stack exchange,提问作者Bert
相关产品推荐
相关产品推荐

