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文件的模式,可以正常运行。

乱码是由于编码格式,文件叠加是因为没有在新建时将上一次的文件内容清空。

  1. 编码
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;
}
  1. 文件存在则清空,不存在则新建
    创建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涉及到公司,就没全部贴,详情涉及太多。仅以记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/524058.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 完美解决(tomcat error)

error&#xff1a; Linux下启动和关闭tomcat报错&#xff0c;如下图所示&#xff1a; Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this program Neither the JAVA_HOME nor the …

Observers:让 ZooKeeper更具可伸缩性 | 时光机

戳蓝字“CSDN云计算”关注我们哦&#xff01;时光机&#xff1a;搭载这部时光机&#xff0c;带您回顾《程序员》大量优秀文章&#xff0c;重温经典技术干货&#xff0c;我们发现硬核技术永不过时&#xff0c;对于get要点、solve难题、提高自我&#xff0c;仍有非凡意义。作者&a…

企业实战(Jenkins+GitLab+SonarQube)_10_Jenkins通过Depoly插件热部署Java程序

文章目录一、 编辑配置文件1.1. 进入tomcat的conf目录1.2. 编辑tomcat-users.xml文件1.3. 添加配置信息二、 配置说明三、 启动tomcat服务3.1. 启动tomcat3.2. 浏览器访问3.3. 点击Manager App访问4033.4. 编辑配置文件3.5. 注释value部分3.6. 浏览器再次请求四、新建任务&…

简述Qt编程中遇到的编码格式问题

提要 当文本中出现中文的时候&#xff0c;在两者之前的文本编码格式不一样的时候就会出现乱码。就像qt5默认的编码格式为utf-8&#xff0c;而Windows的开发环境默认的是gbk编码。 编码转化 utf-8编码于gbk编码的转换为下面截图中所示。 本文的作者也不是很清除编码格式这块…

苹果支付60亿美元与高通和解?亚马逊不再运营中国国内市场业务;华为愿同德国签“无间谍软件协议”;Facebook开发语音服务...

戳蓝字“CSDN云计算”关注我们哦&#xff01;重磅先知亚马逊&#xff1a;从7月18日起将不再运营中国国内市场业务传Facebook开发语音服务&#xff1a;将与亚马逊和苹果Siri竞争瑞银预计苹果将向高通支付60亿美元和解金任正非&#xff1a;华为愿同德国签“无间谍软件协议”重磅快…

企业实战(Jenkins+GitLab+SonarQube)_11_Jenkins权限的划分

Jenkins 集成Role-based Authorization Strategy插件实现企业级权限管理 文章目录一、Jenkins权限简介&#xff1a;二、Role-based 插件下载和启用2.1. 下载安装2.2. Jenkins 启用Role-Based Strategy三、实战案例演示&#xff1a;3.1. 新建用户3.2. 创建角色3.2.1. 创建一个全…

漫威电影宇宙观影指南,口碑票房最佳都是谁

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者&#xff1a;胡萝卜酱转自&#xff1a;DataGo数据狗美漫迷&#xff0c;尤其是漫威…

jenkins 远程启动tomcat报错:Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

异常现象&#xff1a; jenkins 远程启动tomcat报错&#xff1a;Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 解决方案&#xff1a; 在开始脚本前面添加java的变量 export JAVA_HOME/app/jdk1.8.0_144 export CLASSPATH.:$JAVA_HOME/lib/dt.ja…

qt中update()的粗略理解

理解 项目中需要通过设置来更新界面&#xff0c;这个过程中若是窗口没有发生变化&#xff0c;即使通过调用update()函数来触发重绘函数重绘窗口&#xff0c;也不能立即显示被重绘的窗口。只有窗口变化的时候才会被显示出来。 示例说明 双击选中窗口&#xff0c;希望窗口的边…

漫话:如何给女朋友解释什么是乐观锁与悲观锁

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;最近&#xff0c;我和女朋友商量好&#xff0c;我负责制定行程&#xff0c;她负责购买…

tomcat在linux下开机启动

一、tomcat自启动设置方法 1、修改/etc/rc.d/rc.local这个文件 vim /etc/rc.d/rc.local 2、编辑/etc/rc.d/rc.local文件&#xff0c;最后添加下面两行脚本 export JAVA_HOME/app/jdk1.8.0_144 /app/apache-tomcat-9.0.20/bin/startup.sh start想学习更多微服务、分布式、中间…

qt中QList使用removeAt()删除元素

提要 QList删除元素的时候需要特别注意一点&#xff0c;将元素删除后链表中元素的排列。删除一个元素后&#xff0c;后面的元素会补到被删元素的位置&#xff0c;这样在for循环中若删除元素后继续执行下标&#xff0c;则会少遍历元素。下面看一个示例。 示例 下面是出错的代…

云计算之基,一文带你速懂虚拟化KVM和XEN

戳蓝字“CSDN云计算”关注我们哦&#xff01;技术头条&#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前&#xff0c;get要点、solve难题&#xff0c;统统不在话下&#xff01;作者 &#xff1a;Pasca来源 &#xff1a;蛋蛋团正文 &#xff1a;共2022 字预计阅读时…

gradle下载及配置

下载&#xff1a;https://gradle.org/install/#manually 参考链接&#xff1a;https://www.cnblogs.com/linkstar/p/7899191.html 配置&#xff1a; 新建系统变量&#xff1a; GRADLE_HOME D:\Program Files\gradle-5.2.1编辑path,添加全局变量&#xff1a; ;%GRADLE_HOME%\…

qt自定义含有拖动功能的窗口在点击窗口的下拉列表时窗口移动

提要 自定义的弹出窗口&#xff0c;窗口可以实现按下鼠标拖动&#xff0c;鼠标释放停止拖动&#xff0c;窗口种含有子控件&#xff0c;下拉列表&#xff0c;在点击下拉列表时窗口移动。 解决方法 因为点击下拉列表的时候&#xff0c;触发了窗口的移动事件&#xff0c;所以添…

数字化转型2.0落地的正确姿势 | 人物志

戳蓝字“CSDN云计算”关注我们哦&#xff01;人物志&#xff1a;观云、盘点、对话英雄。以云计算风云人物为核心&#xff0c;聚焦个人成长、技术创新、产业发展&#xff0c;还原真实与鲜活&#xff01;如今&#xff0c;企业数字化转型已经进入2.0时代&#xff0c;数字化转型2.0…

linux上怎么解压zip文件和tar.gz文件

解压zip文件的方法 使用命令&#xff1a; unzip xxx.zip解压tar.gz文件的方法 使用命令&#xff1a; tar -zxvf xxx.tar.gz

新华三首发数字大脑计划;微软进军物联网领域?说好的三星折叠屏发布会,就这样不开了?Google 发布小型芯片 Jacquard...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 波音首席执行官“声明安全”…

OpenGL 图像白平衡色温

目录 一.OpenGL 图像白平衡色温 1.IOS Object-C 版本1.Windows OpenGL ES 版本2.Windows OpenGL 版本 二.OpenGL 图像白平衡色温 GLSL Shader三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenG…

Linux6、7 系列 安装、卸载mysql

Linux环境下载mysql&#xff1a; 点击链接&#xff1a; https://blog.csdn.net/weixin_40816738/article/details/90111456 一、安装环境依赖&#xff1a; yum install -y cmake make gcc gcc-c libaio ncurses ncurses-devel二、安装流程 1、软件解压2、添加系统mysql组和m…