QString在转string时,如果有中文,会出现乱码,如果是文件名,那么读文件时就会出现空指针现象,还是要多注意。
例如下面的代码
#include <QCoreApplication>
#include <QDebug>
#include <string>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString qstr1 = "D:/测试视频/笑傲江湖第1集.mp412345A";
std::string str1 = qstr1.toStdString();
qDebug() << qstr1;
cout << str1 << endl;
return a.exec();
}
运行结果
由于有中文,QString转std::string时不能直接使用toStdString,如果把QString转为u8, 再转string依然是乱码,如下图:
那该如何解决呢,下面提供解决办法,代码如下:
#include <QCoreApplication>
#include <QDebug>
#include <string>
#include <iostream>
using namespace std;
string qstr2str(const QString& qstr)
{
QByteArray cdata = qstr.toLocal8Bit();
return string(cdata);
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString qstr1 = u8"D:/测试视频/笑傲江湖第1集.mp412345";
//std::string str1 = qstr1.toStdString();
std::string str1 = qstr2str(qstr1);
qDebug() << qstr1;
cout << str1 << endl;
return a.exec();
}
toLocal8Bit()的解释如下:
Returns the local 8-bit representation of the string as a QByteArray. The returned byte array is undefined if the string contains characters not supported by the local 8-bit encoding.
QTextCodec::codecForLocale() is used to perform the conversion from Unicode. If the locale encoding could not be determined, this function does the same as toLatin1().
If this string contains any characters that cannot be encoded in the locale, the returned byte array is undefined. Those characters may be suppressed or replaced by another.
string转QString也会乱码,解决方法如下:
//string转QString
QString str2qstr(const string& str)
{
return QString::fromLocal8Bit(str.data());
}
测试代码如下:
#include <QCoreApplication>
#include <QDebug>
#include <string>
#include <iostream>
using namespace std;
//QString转string
string qstr2str(const QString& qstr)
{
QByteArray cdata = qstr.toLocal8Bit();
//QByteArray cdata = qstr.toUtf8(); //string乱码
return string(cdata);
}
//string转QString
QString str2qstr(const string& str)
{
return QString::fromLocal8Bit(str.data());
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString name = u8"D:/测试视频/笑傲江湖第1集.mp412345";
//std::string sname = qstr1.toStdString();
std::string sname = qstr2str(name);
qDebug() << name;
cout << sname << endl;
string sname2 = "abc天龙八部123";
cout << "带中文的string " << sname2 << endl;
QString name2 = str2qstr(sname2);
qDebug() << u8"string转QString的结果 --> " << name2;
return a.exec();
}
输出结果:
“D:/测试视频/笑傲江湖第1集.mp412345”
string转QString的结果 --> “abc天龙八部123”
D:/测试视频/笑傲江湖第1集.mp412345
带中文的string abc天龙八部123
打印时,qDebug先打印出来,cout后打印出来。