文章總結(jié)在最后面,想快速解決問(wèn)題的可以直接拉到最后。
一、使用變量顯示中文字符
到QT5以后,一般情況下要顯示中文字符最簡(jiǎn)單的就是使用
QStringLiteral(“我是中文”)
但是QStringLiteral所用參數(shù)只能是字符串常量,不能為變量。
所以當(dāng)使用類似QStringLiteral(str)的代碼時(shí)候會(huì)報(bào)錯(cuò):
error: expected primary-expression before 'enum'
enum { Size = sizeof(QT_UNICODE_LITERAL(str))/2 - 1 }; \
^
因此想到使用
string str = "這是中文";
QString::fromLocal8Bit(str);
但會(huì)發(fā)現(xiàn)qDebug后輸出的是
"榪欐槸涓\uE15F枃"
這時(shí)候使用QString::fromStdString(str)就能解決這個(gè)問(wèn)題
string str = "這是中文";
QString::fromStdString(str)
輸出結(jié)果:
"這是中文"
以上是針對(duì)于字符串變量是string類型的情況,若是QString則先將其轉(zhuǎn)成string,參考代碼如下:
QString data = query.value(i).toString();//獲得數(shù)據(jù)庫(kù)中第i個(gè)字段的值
QByteArray cdata = data.toLocal8Bit();
string str = string(cdata).data();//這兩行換成string str = data.toStdString();依然會(huì)亂碼
qDebug()<<QString::fromStdString(str);//輸出轉(zhuǎn)換成中文字符的結(jié)果
二、出現(xiàn)部分中文亂碼
如果上面的方法還不行,就用以下方法:
該方法同時(shí)可以解決部分亂碼問(wèn)題,比如末尾句號(hào)變成‘??’,‘(’后的漢字變成‘??’:
這里獲取mysql第二個(gè)字段testcol的值:

這時(shí)候mysql中的數(shù)據(jù)是沒(méi)問(wèn)題的:

但qDebug的結(jié)果這三個(gè)地方都出現(xiàn)了部分亂碼:

解決方法:
直接在main函數(shù)里加上:
#include <QTextCodec>
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QT5可以用,有這個(gè)函數(shù)的。
就像這樣:

Paste_Image.png
超簡(jiǎn)潔的總結(jié)
- 一、QT5使用變量顯示中文字符(不能用QStringLiteral):
string str = "這是中文";
QString::fromStdString(str)
- 二、部分中文亂碼(如“??”),在主函數(shù)添加:
#include <QTextCodec>
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));