目录
- 原因
- 解决方案
- 总结
原因
使用VS+Qt出现中文乱码的情况一般都是给控件添加中文文本时出现,而控件需要的字符串类型是QString,默认是utf-8。在 Visual Studio 中,源代码文件的默认执行字符集可能是 Windows 默认的 ANSI 字符集,这个字符集不直接支持 UTF-8 编码中的所有字符,尤其是中文字符或其他非ASCII字符。
解决方案
有两种方法:
1、使用Qstring::fromLocal8Bit()
//右键菜单
// 通过fromLocal8Bit的方式将一个const char*类型转成QString
std::string str = "删除";
std::cout << str << std::endl;
menu = new QMenu(treeView_);
menu->addAction(QString::fromLocal8Bit("添加"));
menu->addAction(QString::fromLocal8Bit(str.c_str()));
经过测试,这种方式不会影响std::string类型
2、使用#pragma execution_character_set(“utf-8”)预处理指令
在源文件添加这行代码:
#pragma execution_character_set("utf-8")
std::string str = "删除";
std::cout << str << std::endl;
//右键菜单
menu = new QMenu(treeView_);
menu->addAction("添加");
menu->addAction(str.c_str());
通过在源文件的开头添加 #pragma execution_character_set(“utf-8”) 这个指令,你可以告诉编译器,源文件中的字符应该按照 UTF-8 编码来处理。
这个指令只对 Visual Studio 编译器有效,它会影响源文件中的所有字符,包括字符串文字、字符文字和字符字面值。通过设置执行字符集为 UTF-8,可以确保源文件中存在的 Unicode 字符能够被正确处理和显示。
如下图,std::string类型的编码格式被改变,输出乱码。
总结
开发过程中尽量使用QString::fromLocal8Bit(),但是每次都要写这么长很麻烦。
#define StdString2QString(x) (QString::fromLocal8Bit(x.c_str()))
std::string strAdd_ = "添加";
std::string strDel_ = "删除";
std::cout << strDel_ << std::endl;
//右键菜单
menu = new QMenu(treeView_);
menu->addAction(StdString2QString(strAdd_));
menu->addAction(StdString2QString(strDel_));