前言
读取文本内容,有时候读取的内容中文会乱码,这跟编码格式有关,即读取时的编码格式和该文本的编码格式不一致。一般有utf-8和gbk两种编码不一致导致。解决办法有两种
第一种
main函数所在的地方修改
#pragma execution_character_set("utf-8")
#include "frmlightbutton.h"
#include <QApplication>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QApplication a(argc, argv)
QFont font;
font.setFamily("Microsoft Yahei");
font.setPixelSize(13);
a.setFont(font);
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
#if _MSC_VER
QTextCodec *codec = QTextCodec::codecForName("gbk");
#else
QTextCodec *codec = QTextCodec::codecForName("utf-8");
#endif
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
#else
QTextCodec *codec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(codec);
#endif
QWidget w;
w.show();
return a.exec();
}
即将这俩段加在相应地方
#pragma execution_character_set("utf-8")
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
#if _MSC_VER
QTextCodec *codec = QTextCodec::codecForName("gbk");
#else
QTextCodec *codec = QTextCodec::codecForName("utf-8");
#endif
QTextCodec::setCodecForLocale(codec);
QTextCodec::setCodecForCStrings(codec);
QTextCodec::setCodecForTr(codec);
#else
QTextCodec *codec = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForLocale(codec);
#endif
此方法还可以解决,整个程序中菜单中中文乱码的问题
第二种
在具体地方具体判断
QFile file(fileName);
if (!file.open(QFile::ReadOnly | QFile::Text)) {
return;
}
QByteArray buff= file.readAll();//读取所有内容
QString str;
bool readOk = false;
QStringList codecForNameList;
codecForNameList<<"utf-8"<<"gbk";//几种格式轮流读,没有非法字符就对了
for(int i=0; i< codecForNameList.length(); i++)
{
QTextCodec::ConverterState state;
QTextCodec *codec = QTextCodec::codecForName(codecForNameList.at(i).toLatin1().data());
QString str = codec->toUnicode( buff.constData(), buff.size(), &state);//以uft-8格式
if (state.invalidChars <= 0)
{
readOk = true;
break;
}
}
if(!readOk)
{
//万一都不行,那就按utf-8乱码就乱码吧
file.close();
if (!file.open(QFile::ReadOnly | QFile::Text)) {
return;
}
QTextStream in(&file);
in.setCodec(QTextCodec::codecForName("utf-8"));
str = in.readAll();
}
file.close();
//调用这个不乱码
QString GetQString(QByteArray byteArray)
{
QTextCodec::ConverterState state;
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
QString qstr = codec->toUnicode(byteArray.constData(), byteArray.size(), &state);
if (state.invalidChars > 0)
qstr = QTextCodec::codecForName("GBK")->toUnicode(byteArray);
else
qstr = byteArray;
return qstr;
}
..
其他乱码
有时候还会遇到程序中的一些菜单内容中文乱码问题,一般用上述第一种方法可以解决;
vistual studio 中遇到 还有一种就是修改代码文件的编码格式
怎么找到高级保存项设置?
然后就找到这个选项,就会出来Advanced Save Options设置界面