QT中文乱码问题(字符串变量)
2017-10-24 本文已影响53人
梦远心沉
文章总结在最后面,想快速解决问题的可以直接拉到最后。
一、使用变量显示中文字符
到QT5以后,一般情况下要显示中文字符最简单的就是使用
QStringLiteral(“我是中文”)
但是QStringLiteral所用参数只能是字符串常量,不能为变量。
所以当使用类似QStringLiteral(str)
的代码时候会报错:
error: expected primary-expression before 'enum'
enum { Size = sizeof(QT_UNICODE_LITERAL(str))/2 - 1 }; \
^
因此想到使用
string str = "这是中文";
QString::fromLocal8Bit(str);
但会发现qDebug后输出的是
"杩欐槸涓\uE15F枃"
这时候使用QString::fromStdString(str)
就能解决这个问题
string str = "这是中文";
QString::fromStdString(str)
输出结果:
"这是中文"
以上是针对于字符串变量是string类型的情况,若是QString则先将其转成string,参考代码如下:
QString data = query.value(i).toString();//获得数据库中第i个字段的值
QByteArray cdata = data.toLocal8Bit();
string str = string(cdata).data();//这两行换成string str = data.toStdString();依然会乱码
qDebug()<<QString::fromStdString(str);//输出转换成中文字符的结果
二、出现部分中文乱码
如果上面的方法还不行,就用以下方法:
该方法同时可以解决部分乱码问题,比如末尾句号变成‘??’,‘(’后的汉字变成‘??’:
这里获取mysql第二个字段testcol的值:
这时候mysql中的数据是没问题的:
但qDebug的结果这三个地方都出现了部分乱码:
解决方法:
直接在main函数里加上:
#include <QTextCodec>
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QT5可以用,有这个函数的。
就像这样:
Paste_Image.png超简洁的总结
- 一、QT5使用变量显示中文字符(不能用QStringLiteral):
string str = "这是中文";
QString::fromStdString(str)
- 二、部分中文乱码(如“??”),在主函数添加:
#include <QTextCodec>
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));