VSCode运行C语言终端中文乱码的根本原因是Windows终端代码页(默认GBK)与程序输出的UTF-8字节流不匹配,需统一源文件编码、编译器输出字符集和终端代码页:在settings.json中配置code-runner.executorMap的c条目前置chcp 65001 &&,并设置terminal.integrated.profiles.windows自动启用UTF-8终端,同时确保源文件保存为UTF-8。

VSCode 运行 C 语言时终端输出中文乱码,问题基本出在「Windows 终端代码页」和「程序输出字节流编码」没对齐。不是编译器错了,也不是 VSCode 坏了,而是 cmd 或 PowerShell 拿 UTF-8 字节当 GBK 解,自然显示成“锟斤拷”或方块。解决的关键是让三者统一:源文件编码、编译器输出字符集、终端解释代码页。
code-runner.executorMap 里加 chcp 65001 是最直接的改法
这个配置控制 Code Runner 插件运行 C 程序时执行的完整命令链。不改它,printf("你好") 输出的 UTF-8 字节会直接扔进默认代码页为 936(GBK)的终端里,必乱码。
在工作区 .vscode/settings.json 中修改 code-runner.executorMap 的 c 条目:
"c": "chcp 65001 && cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt"
- 必须写
chcp 65001在最前面,且用&&连接,保证切换成功后才继续编译运行 - 不要漏掉
$dir和$fileNameWithoutExt这类变量,否则路径或可执行文件名可能出错 - 如果用的是
g++编译 C++,同样要同步改cpp条目 - 改完一定要保存,且确认没有语法错误(比如多逗号、少引号),否则整个
executorMap失效
terminal.integrated.profiles.windows 让终端一开就 UTF-8
上面那条只管 Code Runner 一键运行,但如果你手动敲 ./a.exe 或调试时开新终端,还是得再输一遍 chcp 65001。这时就要靠终端启动配置来固化。
立即学习“C语言免费学习笔记(深入)”;
在 settings.json 中加入:
"terminal.integrated.profiles.windows": {
"Command Prompt": {
"path": "C:\Windows\System32\cmd.exe",
"args": ["/K", "chcp 65001 > nul"]
},
"PowerShell": {
"source": "PowerShell",
"args": ["-NoExit", "-Command", "chcp 65001 > $null"]
}
},
"terminal.integrated.defaultProfile.windows": "Command Prompt"
-
/K表示执行完命令后保持窗口打开;> nul是为了隐藏Active code page: 65001那行提示,更干净 - PowerShell 的
-NoExit同理,避免终端一闪而退 - 必须显式指定
defaultProfile.windows,否则可能仍默认打开旧版 CMD - 这个配置不影响外部终端(比如你单独开的 cmd.exe),只管 VSCode 内置终端
别碰 files.encoding 改成 GBK —— 这是倒退
有人试过把 files.encoding 设成 gbk,看似源文件里中文不乱,但埋了更大坑:
- C 标准规定源文件若含非 ASCII 字符,编译器需按实现定义方式处理;GCC 默认假设源码是 UTF-8,用 GBK 保存会导致
char *s = "你好";在内存里存的是 GBK 字节,但printf仍按 UTF-8 发送给终端,乱码更难排查 - 团队协作时,别人用 UTF-8 打开你的 GBK 文件,直接全乱;Git diff 显示异常;IDE 自动格式化可能崩
- 现代工具链(包括 MinGW-w64、Clang)都优先适配 UTF-8,硬切 GBK 是向后兼容妥协,不是正解
- 真正该统一的是「输出链路」,不是把源码降级
最关键的其实是验证顺序:先运行 chcp 看终端当前代码页,再检查 settings.json 里 executorMap 和 profiles 是否都写了 65001,最后确认源文件右下角显示的是 UTF-8 而不是 GBK。三者缺一不可,漏掉任意一个环节,乱码就会回来。


















