Windows控制台默认GBK编码,而UTF-8源文件未配置编译器识别时会导致乱码;需在VS中确认右下角编码显示,并设置编译器按UTF-8解析字符串字面量。

Windows 控制台默认使用 GBK 编码,而现代 C++ 源文件(尤其 VS 2019+ 或用 UTF-8 保存的)默认是 UTF-8,两者不匹配就必然乱码——这不是代码写错了,是编码环境没对齐。
确认源文件编码和编译器识别是否一致
VS 中右下角状态栏会显示当前文件编码(如“UTF-8”或“UTF-8 带签名”)。若显示“UTF-8”,但项目未告知编译器按 UTF-8 解析字符串字面量,cout 就会被当 GBK 解码输出,结果错位。
- VS 项目属性 → 配置属性 → 常规 → “字符集”设为“使用 Unicode 字符集”(启用
UNICODE和_UNICODE宏) - 或更直接:项目属性 → C/C++ → 命令行 → 在“附加选项”里加
/utf-8(VS 2015u3+ 支持) - 确保源文件保存为
UTF-8 无 BOM(BOM 可能干扰某些编译器对/utf-8的识别)
设置控制台输出编码为 UTF-8
即使代码编译正确,Windows 控制台默认仍用 CP936(即 GBK),必须手动切换输出页码。只调用 SetConsoleOutputCP(65001) 不够,还需确保输入页码同步(否则 cin 输入中文也可能出问题)。
- 在
main()开头立即调用:SetConsoleOutputCP(CP_UTF8);
SetConsoleInputCP(CP_UTF8); - 需包含头文件:
- 该 API 仅 Windows 有效;跨平台程序应改用宽字符 +
wcout,并配_setmode(_fileno(stdout), _O_U16TEXT)
用 wcout 替代 cout 输出中文(推荐长期方案)
直接操作 UTF-8 字节流容易受终端、字体、缓冲区影响;宽字符路径(std::wcout)由系统底层处理编码转换,稳定性更高,且与 Windows API 天然兼容。
立即学习“C++免费学习笔记(深入)”;
- 字符串字面量加
L前缀:L"你好" - 输出前设置缓冲区模式:
_setmode(_fileno(stdout), _O_U16TEXT);
std::wcout << L"你好" << std::endl; - 注意:
std::wcout默认不自动 flush,建议搭配std::endl或手动std::wcout.flush() - 避免混用
cout和wcout(会导致流状态冲突)
真正卡住人的往往不是某一行代码,而是“源文件编码、编译器参数、控制台页码、C++ 流类型”这四者中有一环没对上。尤其容易忽略的是:VS 新建文件默认是 UTF-8 带 BOM,而 /utf-8 编译器开关对 BOM 敏感——删掉 BOM 再试,常有奇效。










