Windows控制台默认GBK编码导致UTF-8中文输出乱码,需改代码页为65001、项目设Unicode、源文件存为UTF-8带BOM,并用std::wcout配合std::locale::global()和imbue()正确设置本地化。
Windows 控制台默认编码不是 UTF-8
直接用 std::cout 输出中文字符串(如 "你好"),在 VS 默认配置下大概率显示为问号或方块——这不是代码写错了,而是控制台的活动代码页(Active Code Page)默认是 GBK(CP936),而源文件保存为 UTF-8 时,字节序列不匹配导致解码失败。
常见错误现象:???、???、空格乱跳、std::cout 输出后光标错位,甚至 std::wcout 报 bad_cast 或直接崩溃。
- 确认当前代码页:命令行运行
chcp,输出类似活动代码页: 936 - 临时切换到 UTF-8:执行
chcp 65001(但仅对当前终端有效,且部分旧版 Windows 对 UTF-8 支持不完整) - VS 项目需同步设置:右键项目 → 属性 → 配置属性 → 常规 → “字符集” 改为
使用 Unicode 字符集(启用wchar_t支持) - 源文件必须保存为带 BOM 的 UTF-8(VS 中“另存为”→ 编码选
UTF-8 带签名),否则编译器可能按系统默认编码读取
用 std::wcout 替代 std::cout 并设置本地环境
std::cout 是窄字符流,底层依赖 char 和当前代码页;而 std::wcout 处理 wchar_t,配合正确的本地环境(locale)才能映射到控制台真实编码。
关键操作不是“加 L 前缀就完事”,而是必须显式调用 std::locale::global() 和 std::wcout.imbue():
立即学习“C++免费学习笔记(深入)”;