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 或生僻字显示为方框

☐☐☐☐☐☐☐☐☐

这是因为当前控制台使用的字体不支持这些字符,你需要修改控制台的字体;