结论:乱码源于源文件编码、编译器解析与控制台解码三者未对齐;需先用chcp或getconsoleoutputcp()确认当前代码页(默认936),再统一设为65001并配合适当字体、编译选项及输入/输出cp设置。

先说结论:乱码不是代码写错了,而是源文件编码、编译器解析规则、控制台解码方式这三者没对齐。只改其中一环,大概率白忙。
怎么看当前控制台用的是什么编码
这是排查的第一步,也是最容易被跳过的一步。Windows 控制台默认是 936(GBK),不是 65001(UTF-8)。不确认这点,后面所有操作都像蒙眼调参。
- 在 CMD 或 CLion 终端里直接运行
chcp,输出类似活动代码页: 936就说明当前是 GBK - 在 C++ 程序里也可以查:
GetConsoleOutputCP()返回值是936还是65001 - 注意:CLion 内置终端和 Windows Terminal 默认行为可能不同,得分别验证;外部 CMD 窗口的代码页不会被程序自动继承
为什么 std::cout 会输出 <code>浣犲ソ
这是最典型的“源文件 UTF-8 + 编译器按 GBK 解析”组合。你用 VS Code 保存的 .cpp 是 UTF-8(无 BOM),但 MSVC 默认用系统代码页(936)读源码,于是把 UTF-8 的三字节序列 0xE4 0xB8 0xAD 当成三个 GBK 字符来解释,结果就是 浣(0xE4B8)、犲(0xB8AD)这类错位字。
- MSVC 下加编译参数
/utf-8,强制让/source-charset和/execution-charset都走 UTF-8 - GCC/Clang 下对应的是
-finput-charset=utf-8 -fexec-charset=utf-8 - CLion 用户:进
Settings → Editor → File Encodings,把Global Encoding和Project Encoding都设为UTF-8,同时勾选Transparent native-to-ascii conversion关掉(它会偷偷转义中文)
为什么加了 SetConsoleOutputCP(65001) 还是乱码
这个函数只管“输出”,不管“输入”和“源码解析”。如果你从控制台用 std::cin 读中文,或者程序要读含中文的配置文件,那还得同步设 SetConsoleCP(65001),否则输入环节就卡住了。
- 必须在
main()开头第一行调用,晚了可能std::cout已经初始化完毕,设置无效 - 记得
#include <windows.h></windows.h>,且只在_WIN32下条件编译,否则 Linux/macOS 编译不过 - 字体也得支持 UTF-8:CMD 属性 → 字体 → 改成
Lucida Console或Consolas;Windows Terminal 可设fontFace: "Cascadia Code" - 如果用了
std::wcout,光设 CP 不够,还得std::wcout.imbue(std::locale("")),且确保系统区域设置里“Beta: 使用 Unicode UTF-8 提供全球语言支持”没被勾选(它会让std::locale("")加载出错)
跨平台项目怎么避免每次手动救火
Linux/macOS 终端原生认 UTF-8,Windows 却要一堆 API 调用,硬写 #ifdef _WIN32 很容易漏掉某处。更稳的做法是把编码适配下沉到构建层和运行时环境。
- CMake 中统一加编译选项:
add_compile_options($:/utf-8> $>:-finput-charset=utf-8 -fexec-charset=utf-8>) - CI 流水线里强制设置环境变量:
export LANG=zh_CN.UTF-8(Linux)或chcp 65001 > nul(Windows runner) - 源文件保存策略:禁用 BOM —— VS Code 默认就是;CLion 要关掉
File → Settings → Editor → File Encodings → UTF-8 with BOM选项 - 终极兜底:不用
std::cout,改用printf("%s", "你好"),它绕过 iostream 缓冲和 locale 初始化时机问题,只要终端编码匹配就稳
真正麻烦的从来不是“怎么让这一行输出中文”,而是“怎么让整个工具链(编辑器、编译器、终端、CI、协作同学)默认就站在同一套编码规则上”。一旦某个环节悄悄退回到 GBK(比如同事用记事本改了配置文件),乱码就会立刻复现——这种隐性依赖,比语法错误更难 debug。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











