Qt Creator中文乱码或编译报错主因是源文件编码与MSVC解读不匹配:须保存为UTF-8 with BOM,并在.pro或CMakeLists.txt中添加/utf-8;字符串推荐u8"你好"或QStringLiteral(u8"你好");控制台输出需chcp 65001或SetConsoleOutputCP(CP_UTF8);.qrc内文本也须转UTF-8-BOM。

Qt Creator里中文乱码或编译报错,90%是源文件编码和MSVC编译器解读方式不匹配——不是代码写错了,而是编译器根本没“看懂”你写的中文。
源文件必须保存为UTF-8 with BOM
MSVC(尤其是老版本)不认纯UTF-8,它靠BOM(EF BB BF)判断文件是不是UTF-8。没BOM就默认按GBK读,一读就错,轻则显示方块,重则编译报error C2001: 常量中有换行符或error C2065: 未声明的标识符(其实是把中文当成了非法字符)。
- Qt Creator中:菜单栏
工具 → 选项 → 文本编辑器 → 行为,把默认编码设为UTF-8,并勾选添加 UTF-8 BOM - 已有文件乱码:用Notepad++打开,
编码 → 转为UTF-8-BOM,再保存 - 新建文件会自动带BOM,但复制粘贴进来的中文可能不继承编码,建议手动检查
编译器参数要显式指定UTF-8输入
光靠BOM还不够,特别是Qt 5.15+或Qt 6项目,MSVC需要明确指令告诉它“源码是UTF-8”。否则即使文件带BOM,某些构建配置下仍会回退到系统代码页。
Qt Creator 18.0.2 Windows x86_64 历史版本安装包,适合需要旧版本 IDE、旧项目兼容、Qt/C++ 项目维护、构建套件配置和调试环境回退的用户使用。
- 在
.pro文件里加这行:QMAKE_CXXFLAGS += /utf-8(MSVC专用) - 如果是CMake项目,在
CMakeLists.txt中加:set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8") - MinGW用户不用加这个,但要确保
QMAKE_CXXFLAGS += -finput-charset=UTF-8
字符串字面量别裸写中文
直接写QString str = "你好";依赖源文件编码,风险高。换成更健壮的写法,让编译器和Qt都明确知道这是UTF-8。
- Qt 5.10+推荐:
QString str = QStringLiteral(u8"你好");——u8强制UTF-8字节流,QStringLiteral编译期转成UTF-16,零运行时开销 - Qt 6+可简化为:
QString str = u8"你好";(C++17标准支持) - 绝对避免:
QString::fromLocal8Bit("你好")——Windows下会按GBK解,结果是乱码
控制台输出中文还是乱?那是终端的事
程序本身没乱码,但qDebug()或std::cout打到Windows控制台时又变方块,这不是Qt问题,是cmd/powershell默认用GBK,而你的程序输出的是UTF-8。
- 临时解决:运行前在cmd里执行
chcp 65001(切换UTF-8代码页) - 工程级方案:在
main()开头加SetConsoleOutputCP(CP_UTF8);(Windows API),需#include <windows.h></windows.h> - 注意:
qDebug()输出走Qt自己的日志系统,不受控制台代码页影响;但printf、std::cout会受限制
最常被忽略的一点:.qrc资源文件里嵌的HTML/JSON/文本,如果本身是GBK保存的,加载进来就是错的——BOM和编译器参数对它无效,必须单独转成UTF-8-BOM再加入资源。

















