QJsonObject写入读出json文件中文乱码问题解决

问题的提出:

QJsonObject写入读出json文件中文乱码。

复现步骤:

当json串很长时,我们一般采用流的形式写入文本,否则会截断导致写入不全,如下为将一个很长的json字符串写入qsModelFilePath文件保存。

QFile file(qsModelFilePath);

	if (!file.open(QIODevice::ReadWrite | QIODevice::Text))
	{
		qDebug() << "file error!";
		gpMessageHandler->addErrorMessage(STR("保存模型时出错"));
		CMsgBox(STR("保存模型时出错"), this).Exec();
		return;
	}

	QTextStream jsonStream(&file);
    //jsonStream.setCodec("UTF-8");//处理utf8中文
	jsonStream << strModelJson;
	file.close();   // 关闭file

如下为将上述的qsModelFilePath文件中的json读出来:

    QFile jsonFile(qsJsonFilePath);
	jsonFile.open(QIODevice::ReadOnly);
	QString strModelJson;
	QTextStream jsonStream(&jsonFile);
	//jsonStream.setCodec("UTF-8");//处理utf8中文
	while (!jsonStream.atEnd())
	{
		QString qsLineText = jsonStream.readLine();
		strModelJson.append(qsLineText);
	}
	
	strModelJson = strModelJson.toLower();
	strModelJson = strModelJson.replace(',', ','); // 防止在配置文件中输入中文逗号
	jsonFile.close();
	
	// 使用json文件对象加载字符串
	QJsonParseError error;

	// 使用静态函数获取 QJsonDocument 对象
	QJsonDocument jsonDocument = QJsonDocument::fromJson(strModelJson.toUtf8(), &error);

	// 判断是否对象
	if (!jsonDocument.isObject() || ( error.error != QJsonParseError::NoError))
	{
		return QJsonObject();
	}

	QJsonObject docObject = jsonDocument.object();
    QString strAbsoluteDir = docObject[g_pszAbsoluteDir].toString();

上述保存写入json串到文件、从文件读取json到QString必须都要加入下述代码:

jsonStream.setCodec("UTF-8");//处理utf8中文

即将上面的该句注释取消才能保证读取json到QString代码段中提取json串中含有中文字段的信息不乱码(如下例,strAbsoluteDir 中含有中文):

QString strAbsoluteDir = docObject[g_pszAbsoluteDir].toString();

也就是说为了保证读取出的信息中文不乱码,必须在保存写入json字符串到文件和从文件读取json到QString两端都加入如下代码:

jsonStream.setCodec("UTF-8");//处理utf8中文

两端任何一端缺少该句,都会引起乱码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值