根本原因是终端编码与源文件编码不一致:Windows终端默认GBK,而VS Code新建C文件默认UTF-8;解决关键是统一用UTF-8-BOM保存文件并运行前执行chcp 65001。

VS Code 终端里 printf 输出中文显示为乱码
根本原因是终端编码和源文件编码不一致,且 Windows 默认终端(如 PowerShell 或 CMD)默认用 GBK,而 VS Code 新建的 C 文件通常保存为 UTF-8。编译器照常编译,但运行时终端按错误编码解析字节,就成“烫烫烫”或“涓枃”。
- 确认当前文件编码:右下角点击编码名称(如
UTF-8),选“通过编码重新打开”→GBK,再试运行——如果变正常,说明就是编码错配 - 更推荐统一用
UTF-8:在 VS Code 中保存文件时选“另存为”,勾选“保留 BOM”(仅 Windows 需要),或直接设为默认:"files.encoding": "utf8"+"files.autoGuessEncoding": false(关掉自动猜测,避免误判) - Windows 终端需手动切编码:运行前在终端输
chcp 65001(切换到 UTF-8),否则即使文件是 UTF-8,CMD/PowerShell 仍用 GBK 解析
gcc 编译后 exe 双击运行中文乱码
双击运行绕过了 VS Code 的终端环境,直接调用系统默认控制台,它不会自动执行 chcp 65001,也不读 VS Code 的设置。此时源码、编译、运行三者编码链断裂。
- 不要双击
.exe,一律在 VS Code 集成终端中运行(Ctrl+`呼出,然后./a.exe) - 若必须双击,得在程序开头强制切换控制台编码:Windows 下用
SetConsoleOutputCP(65001)(需#include <windows.h></windows.h>),Linux/macOS 不需要 - 注意:
system("chcp 65001 > nul")这种写法无效——它只改子进程编码,不影响当前进程输出
vscode-cpptools 扩展调试时中文日志全变成问号
这是调试器(如 gdb 或 cppvsdbg)读取字符串时未正确处理多字节 UTF-8 字符,尤其在变量监视窗口或调试控制台中常见。
- 确保
launch.json中启用字符集支持:"console": "integratedTerminal"(别用externalTerminal) - 在
c_cpp_properties.json的configurations里加上:"cStandard": "c11"和"cppStandard": "c++17",避免旧标准对宽字符支持不全 - 调试时想看原始字节,把字符串变量转成
unsigned char *查看,能确认是否真乱码还是显示问题
用 wprintf 和 L"中文" 依然乱码
宽字符路径在 Windows 上本就容易踩坑:源文件编码、编译器识别、运行时 locale、控制台字体四者缺一不可。
立即学习“C语言免费学习笔记(深入)”;
- 源文件必须存为
UTF-8 with BOM(VS Code 右下角选“UTF-8-BOM”) - 代码开头加:
_setmode(_fileno(stdout), _O_U16TEXT);(Windows),否则wprintf输出被当成窄字符流处理 - 终端字体必须支持中文(如“Lucida Console”或“Consolas”),在终端右键→属性→字体里确认
- 别混用
printf和wprintf到同一 stdout——会破坏缓冲区状态,导致后续输出全乱
chcp 65001。其它所有“高级方案”都是在这基础上打补丁,而不是替代它。











