Qt Vc 读取文本中文乱码问题

本文介绍了两种解决C++读取中文文本乱码的方法。第一种是在程序开头设置编码格式,适用于整个程序中的中文显示;第二种是在读取文件时逐个尝试不同编码,确保正确解码。这两种方法能有效处理UTF-8和GBK编码不匹配导致的乱码问题。
摘要由CSDN通过智能技术生成

前言

读取文本内容,有时候读取的内容中文会乱码,这跟编码格式有关,即读取时的编码格式和该文本的编码格式不一致。一般有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设置界面

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值