VSCode中C语言printf输出中文乱码的根本原因是终端默认代码页为GBK(936),而程序输出UTF-8字节流,解码错位;必须在终端启动时执行chcp 65001、配置settings.json中terminal.integrated.profiles.windows、确保文件保存为UTF-8无BOM、程序内调用SetConsoleOutputCP(65001),并统一字体支持,五者缺一不可。

VSCode 里 printf 输出中文乱码,改 files.encoding 没用——终端本身没切到 UTF-8,字节流发出去了,但控制台用 GBK 解,必然崩。
终端启动时必须执行 chcp 65001
PowerShell 或 CMD 启动后默认代码页是 936(GBK),而 C 程序(尤其用 GCC 编译的)输出的字符串字节是 UTF-8 编码。不改终端解码规则,再准的源文件也白搭。
- 临时验证:在 VSCode 集成终端(
Ctrl+`)里先输chcp 65001,回车后再运行./a.exe,立刻变正常 - 永久生效:在
settings.json中添加终端启动命令,确保每次新开终端都自动执行 - 关键配置项:
"terminal.integrated.profiles.windows"里定义 PowerShell 启动参数,必须带-NoExit -Command "chcp 65001 | Out-Null; $host.UI.RawUI.WindowTitle = 'PowerShell'" - 别设成
cmd或旧版Windows PowerShell,要确认"terminal.integrated.defaultProfile.windows"指向你配好的那个 profile 名称
C 程序自己强制切控制台编码(双击也能用)
只靠终端配置不够——用户双击运行 .exe 时根本不会走 VSCode 终端,chcp 命令压根没机会执行。这时得让程序自己接管控制台代码页。
- 头文件加:
#include <windows.h> - 入口函数开头加:
SetConsoleOutputCP(65001); - 注意:
system("chcp 65001 > nul")无效,它只影响子进程,不改当前 stdout 的解码行为 - 如果用了宽字符(
wprintf),还得额外调_setmode(_fileno(stdout), _O_U16TEXT),否则 Windows 仍当窄字符流处理
文件保存必须是 UTF-8,且不能带 BOM(除非你明确需要)
VSCode 默认新建文件是 UTF-8,但 Windows 下某些场景(比如系统区域为中文时)会偷偷用 GBK 写入内容,却标称 UTF-8——这就是“看着是 UTF-8,实际存的是 GBK 字节”的坑。
- 新建 C 文件后,立刻点右下角编码 →
Save with Encoding→ 选UTF-8(注意是全小写,不是UTF-8或UTF8) - 全局锁定:在
settings.json加两行:"files.encoding": "utf8"和"files.autoGuessEncoding": false,关掉自动猜测,避免误判 - 不要勾选 “UTF-8 with BOM”,除非你依赖老工具(如某些批处理或注册表编辑器);BOM 在 C 源码里可能被编译器当作非法字符报错
最容易被忽略的是:文件编码、终端输入/输出编码、进程环境变量、控制台代码页、字体支持——这五者必须全部对齐。少一个,printf("中文") 就可能变成 “烫烫烫” 或方块。


















