场景:Windows 下使用VSCode 编写C++程序,输出中文乱码
编译器:MinGW, 使用CMakeList.txt 脚本自动编译
解决方案:
在脚本中添加以下内容:
bash
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# 2. 在 project 之后,根据编译器 ID 进行判断
# CMAKE_CXX_COMPILER_ID 的值通常是: MSVC, GNU, Clang, AppleClang
if(MSVC)
# --- 针对 Visual Studio (MSVC) ---
# /utf-8 既设置源码集也设置执行集,完美支持中文
add_compile_options(/utf-8)
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
# --- 针对 MinGW / GCC / Clang ---
add_compile_options(-finput-charset=UTF-8)
add_compile_options(-fexec-charset=GBK)
else()
message(WARNING "Unknown compiler: ${CMAKE_CXX_COMPILER_ID}")
endif()
🔍 为什么这么做?
-finput-charset=UTF-8:告诉 GCC:"我的.cpp文件是用 UTF-8 保存的,请按 UTF-8 读取里面的中文。"-fexec-charset=GBK:告诉 GCC:"编译出来的.exe文件里,字符串常量请转换成 GBK 编码。"- 原因:Windows 的中文控制台(cmd / PowerShell)默认使用 GBK (CP936) 编码。如果 exe 里存的是 UTF-8,控制台就会显示乱码。
修改保存后,点击 VS Code 上方的"构建"或重新运行 CMake.
总结:
Windows 下 GCC/MinGW + 中文代码 + CMake 导致的编码冲突,核心原因:
代码里写了中文字符串(创建成功)
GCC 编译器默认用 GBK 编码,源码是 UTF-8
字节不匹配 → 直接报非法字节序列