乱码需先确认发生在output面板还是terminal面板:前者仅与vscode解码及code runner配置相关,后者才涉及terminal.integrated.encoding等终端设置;统一源码与编译器编码为utf-8,并避免中文路径。

确认乱码发生在哪一层:输出面板 vs 集成终端
Code Runner 默认把程序输出扔进“输出”面板(Output tab),但它不是真正的终端,不响应 chcp 或环境变量。你在外部 cmd 里执行 chcp 65001,对它完全无效。而集成终端(Terminal tab)才是真实的 shell 环境,支持代码页切换、PYTHONIOENCODING、LANG 等设置。
所以第一步必须确认:你看到乱码的地方是 Output 面板,还是 Terminal 面板?
- 如果是
Output面板:只和 VSCode 内部解码逻辑有关,跟系统chcp无关;重点查文件保存编码 + Code Runner 的 runner 配置 - 如果是
Terminal面板:才需要动terminal.integrated.encoding、shell 启动脚本、或编译器参数
文件保存编码与源码字符串编码必须一致
VSCode 打开一个 .cpp 或 .c 文件时,用的是 files.encoding 设置的编码去读字节流;但编译器(如 g++)读同一份文件时,可能按自己的默认规则解析——比如 Windows 下 MinGW 默认按系统代码页(chcp 936 即 GBK)读字符串字面量。这就导致:VSCode 显示正常,但 std::cout 输出乱码。
解决思路不是“让编辑器迁就编译器”,而是统一用 UTF-8:
- 点击右下角
UTF-8→ 选Save with Encoding→UTF-8(确保带 BOM 的选项不要勾) - 在 C++ 源码开头加
#pragma execution_character_set("utf-8")(仅 MSVC 支持) - 对 g++/clang,加编译参数
-finput-charset=utf-8 -fexec-charset=utf-8,写进 Code Runner 的code-runner.executorMap
Code Runner 的 terminal 和 output 行为不能混用
Code Runner 的配置项 code-runner.runInTerminal 控制输出去哪。设为 true 才走集成终端,才能生效 terminal.integrated.encoding;设为 false(默认)则走 Output 面板,此时:
-
terminal.integrated.encoding完全无效 -
chcp命令不起作用 - 唯一能干预的是 runner 自己的执行命令字符串,比如在
code-runner.executorMap里把g++命令改成:chcp 65001 >nul && g++ -finput-charset=utf-8 -fexec-charset=utf-8 $fileName -o $fileNameWithoutExt && chcp 65001 >nul && ./$fileNameWithoutExt
注意:Windows 下 chcp 65001 必须在每次命令前重置,因为 Code Runner 每次新开一个 cmd 实例,代码页会恢复默认。
别忽略运行路径里的中文字符
哪怕编码全设对了,只要当前文件路径含中文(比如 D:\我的项目\main.cpp),g++ 在 Windows 下极大概率报错或静默失败,错误信息本身还可能是乱码。这不是编码问题,是工具链兼容性问题。
临时解法很直接:
- 把项目移到纯英文路径下,例如
C:\dev\hello - 在 Code Runner 配置中加
"code-runner.preserveFocus": false,方便快速发现路径报错 - 避免使用全角括号、顿号、空格——这些在 cmd 中要额外转义,一不留神就中断命令流
真正麻烦的不是显示乱码,而是乱码掩盖了路径错误。先砍掉路径里的中文,再调编码,排查效率高得多。











