Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)文件編碼格式識(shí)別
一、前言
在做數(shù)據(jù)導(dǎo)入導(dǎo)出的過(guò)程中,如果應(yīng)用場(chǎng)景多了,相信各位都會(huì)遇到一個(gè)問(wèn)題就是文件編碼的問(wèn)題,有些文件是ANSI編碼,有些是utf8編碼,有些又是utf8帶bom編碼,不同的文件編碼如果都用同一種編碼格式去解析讀取出來(lái)的數(shù)據(jù)的話(huà),肯定會(huì)遇到亂碼的問(wèn)題,這并不是Qt的問(wèn)題,也不是什么Qt亂碼的問(wèn)題,而是要識(shí)別到文件的編碼然后用對(duì)應(yīng)的編碼去讀取內(nèi)容,這樣就不會(huì)出現(xiàn)亂碼,當(dāng)然亂碼的出現(xiàn)肯定是中文,如果文件全部是英文數(shù)字,無(wú)論何種編碼,都不會(huì)亂碼。
那么問(wèn)題來(lái)了,如何用程序自動(dòng)識(shí)別文件的編碼格式呢?找遍了搜索沒(méi)有找到完整的答案。查閱資料得知utf8帶bom編碼都會(huì)有個(gè)固定的頭部字節(jié)EFBBBF,所以這個(gè)好區(qū)分,由于ANSI編碼和utf8編碼沒(méi)有對(duì)應(yīng)的頭部字節(jié)標(biāo)識(shí),所以需要轉(zhuǎn)個(gè)彎來(lái)處理,依然是讀取頭部的三個(gè)字節(jié),用QTextCodec的toUnicode函數(shù)轉(zhuǎn)換,轉(zhuǎn)換結(jié)果的ConverterState可以識(shí)別到可用字符數(shù)量,如果數(shù)量大于0說(shuō)明是ANSI編碼,需要用gbk去解碼。
二、功能特點(diǎn)
- 組件同時(shí)集成了導(dǎo)出數(shù)據(jù)到csv、xls、pdf和打印數(shù)據(jù)。
- 所有操作全部提供靜態(tài)方法無(wú)需new,數(shù)據(jù)和屬性等各種參數(shù)設(shè)置采用結(jié)構(gòu)體數(shù)據(jù),極為方便。
- 同時(shí)支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等數(shù)據(jù)源。
- 提供靜態(tài)方法直接傳入QTableView、QTableWidget控件,自動(dòng)識(shí)別列名、列寬和數(shù)據(jù)內(nèi)容。
- 每組功能都提供單獨(dú)的完整的示例,注釋詳細(xì),非常適合各階段Qter程序員。
- 原創(chuàng)導(dǎo)出數(shù)據(jù)機(jī)制,不依賴(lài)任何office組件或者操作系統(tǒng)等第三方庫(kù),支持嵌入式linux。
- 速度超快,9個(gè)字段10萬(wàn)行數(shù)據(jù)只需要2秒鐘完成。
- 只需要四個(gè)步驟即可開(kāi)始急速導(dǎo)出海量數(shù)據(jù)比如100W條記錄到Excel。
- 同時(shí)提供直接寫(xiě)入數(shù)據(jù)接口和多線(xiàn)程寫(xiě)入數(shù)據(jù)接口,不卡主界面。
- 可設(shè)置標(biāo)題、副標(biāo)題、表名。
- 可設(shè)置導(dǎo)出數(shù)據(jù)的字段名、列名、列寬。
- 可設(shè)置末尾列自動(dòng)拉伸填充,默認(rèn)拉伸更美觀。
- 可設(shè)置是否啟用校驗(yàn)過(guò)濾數(shù)據(jù),啟用后符合規(guī)則的數(shù)據(jù)特殊顏色顯示。
- 可指定校驗(yàn)的列、校驗(yàn)規(guī)則、校驗(yàn)值、校驗(yàn)值數(shù)據(jù)類(lèi)型。
- 校驗(yàn)規(guī)則支持 精確等于==、大于>、大于等于>=、小于<、小于等于<=、不等于!=、包含contains。
- 校驗(yàn)值數(shù)據(jù)類(lèi)型支持 整型int、浮點(diǎn)型float、雙精度型double,默認(rèn)文本字符串類(lèi)型。
- 可設(shè)置隨機(jī)背景顏色及需要隨機(jī)背景色的列集合。
- 支持分組輸出數(shù)據(jù),比如按照設(shè)備分組輸出數(shù)據(jù),方便查看。
- 可設(shè)置csv分隔符、行內(nèi)容分隔符、子內(nèi)容分隔符。
- 可設(shè)置邊框?qū)挾?、自?dòng)填數(shù)據(jù)類(lèi)型,默認(rèn)自動(dòng)數(shù)據(jù)類(lèi)型開(kāi)啟。
- 可設(shè)置是否開(kāi)啟數(shù)據(jù)單元格樣式,默認(rèn)不開(kāi)啟,不開(kāi)啟可以節(jié)約大概30%的文件體積。
- 可設(shè)置橫向排版、紙張邊距等,比如導(dǎo)出到pdf以及打印數(shù)據(jù)。
- 提供圖文混排導(dǎo)出數(shù)據(jù)到pdf以及打印示例,自動(dòng)分頁(yè),支持多圖。
- 提供一個(gè)打印樣板中同時(shí)包括橫向縱向排版示例。
- 提供靜態(tài)函數(shù)將控件截圖導(dǎo)出到pdf文件。
- 提供靜態(tài)函數(shù)將圖片轉(zhuǎn)成pdf文件。
- 提供靜態(tài)函數(shù)將csv文件轉(zhuǎn)成xls文件,支持列寬表名等參數(shù)設(shè)置。
- 針對(duì)每列可分別設(shè)置字段對(duì)齊樣式、內(nèi)容對(duì)齊樣式,包括左對(duì)齊、居中對(duì)齊、右對(duì)齊。
- 靈活性超高,可自由更改源碼設(shè)置對(duì)齊方式、文字顏色、背景顏色等。
- 支持任意excel表格軟件,包括但不限于excel2003-2021、wps、openoffice等。
- 純Qt編寫(xiě),支持任意Qt版本+任意編譯器+任意系統(tǒng)。
三、體驗(yàn)地址
體驗(yàn)地址:https://pan.baidu.com/s/1eeL5MTz0rifwtVLegRpkoQ 提取碼:erxm 文件名:bin_dataout.zip
國(guó)內(nèi)站點(diǎn):https://gitee.com/feiyangqingyun
國(guó)際站點(diǎn):https://github.com/feiyangqingyun
四、效果圖
五、相關(guān)代碼
//檢查文件編碼 0=ANSI 1=UTF-16LE 2=UTF-16BE 3=UTF-8 4=UTF-8BOM int DataCsv::findCode(const QString &fileName, QString &flag) { //假定默認(rèn)編碼utf8 int code = 3; flag = "UTF-8"; QFile file(fileName); if (file.open(QIODevice::ReadOnly)) { //讀取3字節(jié)用于判斷 QByteArray buffer = file.read(3); quint8 b1 = buffer.at(0); quint8 b2 = buffer.at(1); quint8 b3 = buffer.at(2); if (b1 == 0xFF && b2 == 0xFE) { code = 1; flag = "UTF-16LE"; } else if (b1 == 0xFE && b2 == 0xFF) { code = 2; flag = "UTF-16BE"; } else if (b1 == 0xEF && b2 == 0xBB && b3 == 0xBF) { code = 4; flag = "UTF-8BOM"; } else { //嘗試用utf8轉(zhuǎn)換,如果可用字符數(shù)大于0,則表示是ansi編碼 QTextCodec::ConverterState state; QTextCodec *codec = QTextCodec::codecForName("utf-8"); codec->toUnicode(buffer.constData(), buffer.size(), &state); if (state.invalidChars > 0) { code = 0; flag = "ANSI"; } } file.close(); } return code; }
以上就是Qt數(shù)據(jù)庫(kù)應(yīng)用之實(shí)現(xiàn)文件編碼格式識(shí)別的詳細(xì)內(nèi)容,更多關(guān)于Qt文件編碼格式識(shí)別的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)餐廳點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06sublime text3搭建配置c語(yǔ)言編譯環(huán)境的詳細(xì)圖解教程(小白級(jí))
這篇文章主要介紹了sublime text3搭建配置c語(yǔ)言編譯環(huán)境,詳細(xì)圖解,小白教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-01-01C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之隊(duì)列的定義與實(shí)現(xiàn)
隊(duì)列是一種特殊的線(xiàn)性表,特殊之處在于它只允許在表的前端(head)進(jìn)行刪除操作,而在表的后端(tail)進(jìn)行插入操作。本文將詳細(xì)講講C語(yǔ)言中隊(duì)列的定義與實(shí)現(xiàn),感興趣的可以了解一下2022-07-07C++中#pragma once與#ifndef對(duì)比分析
當(dāng)我們編寫(xiě)C++代碼時(shí),經(jīng)常需要使用頭文件來(lái)引入一些常用的函數(shù)、類(lèi)或者變量,如果一個(gè)頭文件被重復(fù)包含,就會(huì)導(dǎo)致編譯錯(cuò)誤或者運(yùn)行時(shí)錯(cuò),為了避免發(fā)生,我們需要使用預(yù)處理指令來(lái)防止頭文件被重復(fù)包含,常用的預(yù)處理指令有#pragma once和#ifndef,需要的朋友可以參考下2023-05-05C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易網(wǎng)絡(luò)聊天室
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易網(wǎng)絡(luò)聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06用VC++6.0的控制臺(tái)實(shí)現(xiàn)2048小游戲的程序
本文是作者拜讀劉地同學(xué)的《C語(yǔ)言控制臺(tái)版2048》之后感覺(jué)非常不錯(cuò),添加了注釋之后分享給大家的,方便更多的初學(xué)者閱讀學(xué)習(xí),有需要的小伙伴參考下。2015-03-03