VS Code C/C++ 中文乱码修复指南
控制台输出中文乱码的核心原因在于编码不一致。必须确保 源文件、编译器 和 终端 三者统一使用 UTF-8。
核心原理:Windows 默认终端编码为 GBK (Code Page 936),而 VS Code 默认文件编码为 UTF-8。解决乱码的唯一途径是强制将执行环境对齐为 UTF-8。
1. 统一源文件编码
VS Code 默认创建的文件均为 UTF-8,但需确保并未被意外修改。
- 检查编辑器右下角状态栏,确保显示为 UTF-8。
- 若显示为其他编码(如 GBK),点击该状态栏并选择 Save with encoding -> UTF-8。
如果打开旧文件发现代码本身乱码,请使用 Reopen with encoding 选择正确编码(通常是 GBK)恢复显示,然后再保存为 UTF-8。
2. 配置 Code Runner (最佳实践)
为了避免每次手动切换终端编码,我们通过修改 Code Runner 的执行指令实现自动化。
推荐使用 PowerShell 的对象操作 [Console]::OutputEncoding 替代传统的 chcp 命令,以避免副作用。
请打开 VS Code 设置文件:
{
"code-runner.executorMap": {
"c": "cd $dir; gcc -fexec-charset=UTF-8 '$fileName' -o '$fileNameWithoutExt'; if ($?) { [Console]::OutputEncoding = [System.Text.Encoding]::UTF8; .\\'$fileNameWithoutExt' }"
}
}
🤔 点击展开:命令逐行深度解析
这段脚本利用了 PowerShell 的特性来确保执行流程的稳健性:
gcc -fexec-charset=UTF-8:- 告诉 GCC 编译器,程序执行时的字符串(exec-charset)应按 UTF-8 编码处理,防止编译器按 Windows 默认的 GBK 编译字符串。
if ($?) { ... }:$?是 PowerShell 的布尔变量,代表上一条命令(GCC 编译)是否成功。- 只有编译成功(Return 0),才会执行后续的运行指令。
[Console]::OutputEncoding = ...:- 关键点:直接修改当前会话的 .NET 控制台输出对象编码。比
chcp更底层且稳定。
- 关键点:直接修改当前会话的 .NET 控制台输出对象编码。比
.\\'$fileNameWithoutExt':- 运行编译后的可执行文件。
3. 避坑指南:为什么不用 chcp 65001?
网络上常见的方案是使用 chcp 65001 命令,虽然能解决乱码,但它对 PowerShell 的兼容性极差。
副作用警告:在 PowerShell 中使用 chcp 65001 不稳定,容易导致界面被清空或命令提示符 (Prompt) 丢失,严重影响后续交互。
如果你正在使用以下旧配置,建议替换为第 2 节中的方案:
// ❌ 不推荐的写法
{
"c": "...; if ($?) { chcp 65001 | Out-Null; .\\'$fileNameWithoutExt' }",
}
4. 终端环境建议
Windows 的 GBK 历史包袱是乱码问题的根源,选择合适的终端环境可以大幅提升体验。
- 坚守 Windows:请安装 Windows Terminal。
如果不想折腾虚拟机,微软推出的 Windows Terminal 是最佳选择。它对 Unicode 字符渲染支持极佳,界面现代化,且不会出现旧版 cmd/powershell 窗口的各类渲染 Bug。
- 彻底根治:转向 Linux / WSL。
Linux 环境原生支持 UTF-8,彻底不存在此类编码问题。如果你愿意深入学习,建议在 Windows 上启用 **WSL 进行开发。