qt先生成json文件后程序启动时读取json文件在一组数据模拟下正常,换一组数据就出现乱码
提要
程序编号后自己模拟的数据程序在生成和解析json时都正常,但是换了一组数据,生成的json文件中部分中文乱码,且出现json文件的格式被混乱的现象。
效果
上述出现的不正确的json文件,如下:
{"btnInfo":[{"id":10005,"index":1,"name":"全屏马赛兢},{"id":10007,"index":2,"name":"20210128-SY"},{"id":10010,"index":3,"name":"PPT汇报-2"},{"id":10013,"index":4,"name":"安播例会"},{"id":10022,"index":5,"name":"中星6B/S6视频会议"}]}°媒体外罢},{"id":10061,"index":6,"name":"视频会议20210309"}]}
上述json文件的内容出现部分中问乱码,且json文件的格式也不正常。似乎是两个json文件叠加了。
问题
首先改json文件如下:
{"jsonrpc": "2.0",
"method": "source.getSceneList",
"result": [
{"name": "楼宇1","id": "10001"},
{"name": "楼宇2","id": "10002"},
{"name": "楼宇3","id": "10003"},
{"name": "楼宇4","id": "10004"},
{"name": "楼宇5","id": "10005"},
{"name": "楼宇6","id": "10006"},
{"name": "楼宇7","id": "10007"},
{"name": "楼宇8","id": "10008"},
{"name": "楼宇9","id": "10009"},
{"name": "楼宇10","id": "10010"},
{"name": "楼宇11","id": "10011"},
{"name": "楼宇12","id": "10012"},
{"name": "楼宇巍峨","id": "10013"},
{"name": "楼宇即","id": "10014"},
{"name": "楼宇15","id": "10015"},
{"name": "楼宇16","id": "10016"},
{"name": "楼宇17","id": "10017"},
{"name": "楼宇18","id": "10018"},
{"name": "楼宇19","id": "10019"},
{"name": "楼宇20","id": "10020"},
{"name": "楼宇21","id": "10021"},
{"name": "楼宇时","id": "10019"},
{"name": "楼宇杜","id": "10020"},
{"name": "楼宇及对QP","id": "10021"},
{"name": "楼宇K-P蝴蝶飞","id": "10026"}],
"id": 0
}
通过点击界面上的按钮,按钮的文本如上name字段所示,生成json文件,下次程序启动的时候再将json文件中name字段按照上一次按钮的文本设置到按钮上。上述json文件生成后起初会出现中文为奇数时尾部中文乱码,中文为偶数时不乱码,后改变编码和创建json文件的模式,可以正常运行。
乱码是由于编码格式,文件叠加是因为没有在新建时将上一次的文件内容清空。
- 编码
void createJsonFile()
{QJsonObject data;QJsonObject subData1;QJsonArray array;int index;QMap<int,stuSceNameId>::iterator it;for(it = m_btnInfoMap.begin(); it != m_btnInfoMap.end(); ++it){index = it.key();stuSceNameId temp = *it;subData1.insert("index",index);subData1.insert("id",temp.id);subData1.insert("name",QString::fromLocal8Bit(temp.name.toLocal8Bit()));array.append(subData1);}data.insert("btnInfo",array);QJsonDocument document;document.setObject(data);QByteArray jsonArray = document.toJson(QJsonDocument::Compact);QString strJson(jsonArray);QString strName = QCoreApplication::applicationDirPath() + "/sceneBtnInfo.json";QFile file(strName);if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){QString strTitle = "提示";QString strContent = QString("%1文件打开失败!").arg(strName);QMessageBox::information(this,strTitle,strContent);return ;}QTextStream in(&file);in<<strJson;file.close();
}
先构建json结构,然后创建json文件,由于第三个字段name存在中文,所以将其转换为本地编码。读取json文件后再将其转换为utf-8编码.
QString byteArray = readSceneBtnInfo(strName);//从json文件中读取的字符串outPut<<"读到的字符串:"<<byteArray;if(byteArray.size() == 0){return ;}QByteArray array = byteArray.toUtf8();parseSceneBtnJson(array);
读取json文件的函数如下。
QString readSceneBtnInfo(QString fileName)
{QByteArray allData;
#ifdef OUT_PUToutPut<<"文件路径及名称:"<<fileName;
#endifQTextCodec *code = QTextCodec::codecForName("GBK");QFile file(fileName);if (!file.open(QIODevice::ReadOnly)){#ifdef OUT_PUToutPut<<QString("%1配置文件读取失败!").arg(fileName);
#endifreturn allData;}allData = file.readAll();QString str = code->toUnicode(allData);file.close();
#ifdef OUT_PUT
// outPut<<"json文件内容:"<<allData;
#endifreturn str;
}
- 文件存在则清空,不存在则新建
创建json文件时将文件的打开模式改为以下就可实现文件不存在创建,文件存在则清空文件内容。
QString strName = QCoreApplication::applicationDirPath() + "/sceneBtnInfo.json";QFile file(strName);if(!file.open(QIODevice::WriteOnly | QIODevice::Text)){QString strTitle = "提示";QString strContent = QString("%1文件打开失败!").arg(strName);QMessageBox::information(this,strTitle,strContent);return ;}QTextStream in(&file);in<<strJson;file.close();
提示:
关于编码格式这块儿,作者表示不是很清楚,所以上面描述出错的地方还望更改。问题描述和现象有些乱,问题已解决,由于不是自己的demo涉及到公司,就没全部贴,详情涉及太多。仅以记录。
qt先生成json文件后程序启动时读取json文件在一组数据模拟下正常,换一组数据就出现乱码相关推荐
- Qt关闭程序的时候创建json文件,再次启动时重新加载到界面上
提要 当程序关闭后再次打开程序需要加载上一次的按钮名称设置. 思路 关闭程序的时候保存此刻界面按钮的文本,正常情况下只需在程序退出时调用的析构函数的内部实现,将界面所有的按钮文本生成一个文件,在程序下 ...
- MySQL5.7修改了my.ini文件后服务启动不了
MySQL5.7修改了my.ini文件后服务启动不了 为了再数据库存储一些稀奇古怪的字符串,修改了数据库安装目录中的my.ini文件 直接打开(windows10),默认记事本,打开之后找到mysql ...
- java导出jar包后,程序运行时读取图片、音乐资源文件
java导出jar包后,程序运行时读取图片.音乐资源文件 运行时程序就可以把图片.音乐资源加载进入了 start jre/bin/java -jar 名称.jar
- winform6、(C#)程序开机启动时读取文件失败
winform6.(C#)程序开机启动时读取文件失败 今天在测试程序的时候发现,通过注册表来开机自启动程序时,读取不到配置文件,最后终究是发现了问题所在: 程序中使用了相对路径,而通过注册表启动时程序 ...
- 如何在ASP.NET Core程序启动时运行异步任务(1)
原文:Running async tasks on app startup in ASP.NET Core (Part 1) 作者:Andrew Lock 译者:Lamond Lu 背景 当我们做项目 ...
- 如何在ASP.NET Core程序启动时运行异步任务(3)
原文:Running async tasks on app startup in ASP.NET Core (Part 3) 作者:Andrew Lock 译者:Lamond Lu 之前我写了两篇有关 ...
- 如何在ASP.NET Core程序启动时运行异步任务(2)
原文:Running async tasks on app startup in ASP.NET Core (Part 2) 作者:Andrew Lock 译者:Lamond Lu 在我的上一篇博客中 ...
- 程序启动时,vc2015设置哪个窗体先打开,优先启动,设置方法
程序启动时,vc2015设置哪个窗体先打开,设置方法 工程名对应的APP文件中 InitInstance中 //Caccess_mdb_operationDlg dlg; //可以设置这里,首先启动 ...
- 2.实验室打卡精灵2.0-单实例化、开机启动、托盘操作、程序启动时隐藏主窗口
老规矩,上一张图片 最近对实验室打卡精灵做了一些优化,基本上达到了最初设想的功能. 现在的功能包括: 1.自定义早上.中午.下午.晚上的打卡时间 2.软件单实例化,即如果已经运行了一次再次运行会弹出& ...
最新文章
- object expected错误解决方法
- Python 之 matplotlib (十一) 3D
- unity开宝箱动画_[技术博客]Unity3d 动画控制
- 多元统计分析matlab,MATLAB的统计工具箱中的多元统计分析中提供了聚类分析的两种方法...
- Python chr / ord 函数区别和使用 - Python零基础入门教程
- 非导向传输媒体| 计算机网络
- python logging打印终端_python中那些小众但有用的自带标准库
- Java进阶:The driver is automatically registered via the SPI and manual loading of the driver class is
- USBCAN、CAN分析仪、CANCANFD综合测试分析软件LKMaster主要功能一览
- python内置函数dict()
- oracle rac查看节点及宕库
- 时间序列分析——第三章 资产收益率序列
- python 批量去掉语音中的静音段
- 吊打何同学?B 站 UP 主 24 小时肝出 AirDesk 平替,成本 6000!
- 李维看 .net 和 DELPHI 6 (含李维照片) (转)
- 规划计算机网络需要考虑,论计算机网络规划及实现
- 《0~3岁孩子的 正面管教》——备忘
- 2018-CVPR-Harmonious Attention Network for Person Re-Identification
- mysql启动失败 查看日志文件_mysql诊断启动问题、查看日志文件详解
- MuleSoft知识总结-11.Mule基本组件(Transform Message)