Windows中Visual studio使用Qt5的中文乱码问题

Qt的中文输入至少包括如下两类:

  1. 代码编辑器中的中文
  2. 通过文件选择框打开的中文路径

对于第一种情况,代码编辑器中的中文跟编辑器的编码有关,因此可能会出现在编辑器中能够显示的中文,但是到了Qt的UI界面中就出现了乱码,例如

1
2
3
QString status = "echo 测试 && pause";
ui.textEdit->setText(status);

文本框中出现乱码

原因: Visual Studio中对中文的默认编码和QT对中文的默认编码不一样。也就是说,我们输入了X编码方案的中文,但是在编译阶段,Qt用了Y编码方案进行解码,从而导致源码阶段的乱码。

解决方案,就是设置好编码。

1
2
3
4
5
6
//声明来源是local 8bit
QString status = QString::fromLocal8Bit("echo 测试 && pause");
ui.textEdit->setText(status);
//用unicode字面量
QString status = fromUtf16(u"echo 测试 && pause");
ui.textEdit->setText(status);

对于第二种情况,QString获取到的中文就是它默认的编码方式,因此通过文件选择框获取的文件路径,如果包含中文,它也能够在Qt的UI界面正常展示。

但是如果直接转成string,然后调用system就会出现乱码,如

1
2
3
4
//乱码
QString status = QString::fromUtf16(u"echo 测试 && pause");
string test = status.toStdString();
system(test.c_str());

cmd中的乱码

即,QString转string的时候存在编码上的问题。

解决方案, 将QString转成Loal8Bit才行,而不是直接使用toStdString,之后在构建成string,转成const char*才能避免乱码。

1
2
3
QString status = QString::fromUtf16(u"echo 测试 && pause");
string test(status.toLocal8Bit());
system(test.c_str());

参考资料