C 程序在控制台输出呈现乱码,通常是由于程序的输出编码和控制台的解析编码不一致导致的。
下面这段代码在 Windows 控制台输出乱码,可能是因为控制台默认编码是 GBK,而程序输出是 UTF-8。
#include <stdio.h>
int main(){
printf("你好\n");
}
程序输出
浣犲ソ
查看控制台编码
在控制台使用命令chcp查看;
chcp
活动代码页: 936
活动代码页(Active Code Page)是 Windows 控制台(CMD/PowerShell)当前正在使用的字符编码表。它决定了控制台如何解释你输入的字节(键盘输入)以及如何将内部字节转换为屏幕上显示的字符。
| 代码页 | 名称 |
|---|---|
| 437 | OEM 美国(英文控制台默认) |
| 936 | GBK(简体中文 Windows 默认) |
| 950 | Big5(繁体中文 Windows) |
| 65001 | UTF-8(Unicode 国际标准) |
乱码解决方法
SetConsoleOutputCP(CP_UTF8)和SetConsoleCP(CP_UTF8)是 Windows 控制台专用的 API,用于将控制台的输入输出代码页设置为 UTF-8。这两个函数只在 Windows 平台有效,Linux/macOS 不需要(它们原生支持 UTF-8)。
CP_UTF8 的值为 65001;使用它们需要导入windows.h头文件;
#include <stdio.h>
#include <windows.h>
int main(){
SetConsoleOutputCP(CP_UTF8);
SetConsoleCP(CP_UTF8);
printf("你好\n");
}
你可以使用GetConsoleOutputCP()获取当前终端的输出代码页;
#include <stdio.h>
#include <windows.h>
int main() {
UINT active_cp = GetConsoleOutputCP(); // 获取输出代码页
printf("%u\n", active_cp);
return 0;
}
临时方法
在控制台运行chcp 65001命令修改控制台的编码为 UTF-8;
这种方法适合无法重新编译程序的情况。
Emoji 或生僻字显示为方框
☐☐☐☐☐☐☐☐☐
这是因为当前控制台使用的字体不支持这些字符,你需要修改控制台的字体;