qt先生成json文件后程序启动时读取json文件在一组数据模拟下正常,换一组数据就出现乱码
提要
程序編號(hào)后自己模擬的數(shù)據(jù)程序在生成和解析json時(shí)都正常,但是換了一組數(shù)據(jù),生成的json文件中部分中文亂碼,且出現(xiàn)json文件的格式被混亂的現(xiàn)象。
效果
上述出現(xiàn)的不正確的json文件,如下:
{"btnInfo":[{"id":10005,"index":1,"name":"全屏馬賽兢},{"id":10007,"index":2,"name":"20210128-SY"},{"id":10010,"index":3,"name":"PPT匯報(bào)-2"},{"id":10013,"index":4,"name":"安播例會(huì)"},{"id":10022,"index":5,"name":"中星6B/S6視頻會(huì)議"}]}°媒體外罷},{"id":10061,"index":6,"name":"視頻會(huì)議20210309"}]}上述json文件的內(nèi)容出現(xiàn)部分中問亂碼,且json文件的格式也不正常。似乎是兩個(gè)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": "樓宇時(shí)","id": "10019"}, {"name": "樓宇杜","id": "10020"}, {"name": "樓宇及對(duì)QP","id": "10021"}, {"name": "樓宇K-P蝴蝶飛","id": "10026"}], "id": 0 }通過點(diǎn)擊界面上的按鈕,按鈕的文本如上name字段所示,生成json文件,下次程序啟動(dòng)的時(shí)候再將json文件中name字段按照上一次按鈕的文本設(shè)置到按鈕上。上述json文件生成后起初會(huì)出現(xiàn)中文為奇數(shù)時(shí)尾部中文亂碼,中文為偶數(shù)時(shí)不亂碼,后改變編碼和創(chuàng)建json文件的模式,可以正常運(yùn)行。
亂碼是由于編碼格式,文件疊加是因?yàn)闆]有在新建時(shí)將上一次的文件內(nèi)容清空。
先構(gòu)建json結(jié)構(gòu),然后創(chuàng)建json文件,由于第三個(gè)字段name存在中文,所以將其轉(zhuǎn)換為本地編碼。讀取json文件后再將其轉(zhuǎn)換為utf-8編碼.
QString byteArray = readSceneBtnInfo(strName);//從json文件中讀取的字符串outPut<<"讀到的字符串:"<<byteArray;if(byteArray.size() == 0){return ;}QByteArray array = byteArray.toUtf8();parseSceneBtnJson(array);讀取json文件的函數(shù)如下。
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文件內(nèi)容:"<<allData; #endifreturn str; }創(chuàng)建json文件時(shí)將文件的打開模式改為以下就可實(shí)現(xiàn)文件不存在創(chuàng)建,文件存在則清空文件內(nèi)容。
提示:
關(guān)于編碼格式這塊兒,作者表示不是很清楚,所以上面描述出錯(cuò)的地方還望更改。問題描述和現(xiàn)象有些亂,問題已解決,由于不是自己的demo涉及到公司,就沒全部貼,詳情涉及太多。僅以記錄。
總結(jié)
以上是生活随笔為你收集整理的qt先生成json文件后程序启动时读取json文件在一组数据模拟下正常,换一组数据就出现乱码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 图片夹_各种变调夹的优缺点、原理和使用方
- 下一篇: qt中调整弹出框的位置