QT6.8 自动识别文本文件的编码格式

news2024/11/15 2:06:00

之前写过一个QT自动识别文本文件的编码格式的博文,但是那是基于Qt5.15.2的,在Qt5下运行没有问题,今天改用Qt6.8后,就不行了老是报错,于是针对Qt6,又略微改进了一下。

示例代码:

//获取文件编码格式函数
QStringConverter::Encoding Skysonya::getFileCharacterEncoding(const QString &fileName)
{
    //假定默认编码utf8
    QStringConverter::Encoding encoding = QStringConverter::Utf8;

    QString codecName = "UTF-8";  //为了显示qDebug用
    QFile file(fileName);
    if (file.open(QIODevice::ReadOnly))
    {
        QByteArray firstBytes = file.read(3);
        // qDebug() << "FirstBytes:" << firstBytes << Qt::endl;
        if (firstBytes.startsWith("\xEF\xBB\xBF"))
        {
            // UTF-8 with BOM
            encoding = QStringConverter::Utf8;
            codecName = "UTF-8-BOM";
        }
        else if (firstBytes.startsWith("\xFF\xFE"))
        {
            // UTF-16LE
            encoding = QStringConverter::Utf16LE;
            codecName = "UTF-16LE";
        }
        else if (firstBytes.startsWith("\xFE\xFF"))
        {
            // UTF-16BE
            encoding = QStringConverter::Utf16BE;
            codecName = "UTF-16BE";
        }
        else
        {
            // ANSI or UTF-8
            QFile afile(fileName);
            afile.open(QIODevice::ReadOnly);
            QTextCodec::ConverterState converterState;
            QTextCodec *textcodec =
                QTextCodec::codecForName("utf-8");  //尝试用utf8转换,如果无效字符数大于0,则表示是ansi编码
            int num{};
            while (!afile.atEnd())
            {
                QByteArray line = afile.readLine();  //读取一行ASCII码
                // qDebug() << "Line:" << line << Qt::endl;
                textcodec->toUnicode(line.constData(), line.size(), &converterState);
                num += converterState.invalidChars;
                if (num > 0) break;
            }
            encoding = (num > 0) ? QStringConverter::System : QStringConverter::Utf8;
            codecName = (num > 0) ? "GB18030" : "UTF-8";
        }
        qDebug() << "FileEncoding:" << encoding << codecName << Qt::endl;
        file.close();
    }
    return encoding ;
}

具体使用

//用QTextStream读取文件,整体读取
QString Skysonya::openFileByStreamWhole(const QString &fileName)
{
    QFile file(fileName);
    if (!file.exists())
    {
        messageBox("Warning", tr("打开"), "文件不存在: " + file.errorString());
        return NULL;
    }
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        messageBox("Warning", tr("打开"), "打开文件失败: " + file.errorString());
        return NULL;
    }

    QTextStream textStream(&file);  //用文本流读取文件内容
    // textStream.setAutoDetectUnicode(true);  //自动检测Unicode
    textStream.setEncoding(getFileCharacterEncoding(fileName));
    QString text = textStream.readAll();  //读取全部内容
    file.close();
    return text;
}

自定义类:

#include <QDebug>
#include <QFile>
#include <QFileDialog>
#include <QHeaderView>
#include <QInputDialog>
#include <QMessageBox>
#include <QObject>
#include <QPushButton>
#include <QString>
#include <QTableView>
#include <QTextCodec>
#include <QVector>
#include <QtSql>

enum EncodingFormat
{
    ANSI,
    UTF16LE,
    UTF16BE,
    UTF8,
    UTF8BOM,
};

class Skysonya : public QObject
{
    Q_OBJECT
    Q_ENUM(EncodingFormat)
public:
    explicit Skysonya(QObject *parent = nullptr);
    ~Skysonya();
    QString doAppAbout(QString appName);                                               //程序关于信息
    bool messageBox(QString msgType, QString dlgTitle, QString strInfo);               //中文提示对话框
    QString inputDialog(QString dlgTitle, QString labelText, QString textValue = "");  //中文按钮文本输入对话框
    QTextCodec *getFileCharacterTextCodec(const QString &fileName);                     //获取文件编码格式函数
    QStringConverter::Encoding getFileCharacterEncoding(const QString &fileName);                  //获取文件编码格式函数
    QString openFileByIOWhole(const QString &fileName);                 //用QFile打开文件,整体读取
    QString openFileByIOLines(const QString &fileName);                 //用QFile打开文件,逐行读取
    QString openFileByStreamWhole(const QString &fileName);             //用QTextStream读取文件,整体读取
    QString openFileByStreamLines(const QString &fileName);             //用QTextStream读取文件,逐行读取
    bool saveFileByIOWhole(const QString &fileName, QString text);      //用QFile保存文件,整体保存
    bool saveFileByStreamWhole(const QString &fileName, QString text);  //用QTextStream保存文件,整体保存
    void setTableViewBasicSettings(QTableView *tv);                     // TableView表基础设置
    bool createTableBByTableAColumn(QSqlDatabase sqliteDB, QString tableB, QString tableA,
                                    QString columnName);  //根据数据表A某列创建数据表B
    bool deleteTableRepeatRow(QSqlDatabase sqliteDB, QString tableName, QStringList ruleList);  //删除数据表重复数据
    bool createTableBByTableAColumn(QSqlDatabase sqliteDB, QString tableB, QString tableA,
                                    QStringList columnList);  //根据数据表A某列创建数据表B
    bool readExcelToSQLiteByQXlsx(const QString &fileName, QSqlDatabase sqliteDB, QString tableName,
                                  QString strTitle);  //读取EXcel数据导入到SQLite数据库,使用QXlsx
    bool writeTableviewToExcelByQXlsx(const QString &fileName, QString tableName, QTableView *tableView,
                                      QString strTitle);  //将QTableView数据写入EXcel,使用QXlsx

private:
    QString appVersion;       //软件版本号
    QString buildTime;        //程序构建时间
    QString qtVersion;        // QT版本号
    QString fun_buildTime();  //获取程序构建时间
    QString ArrayToString(int *array, int num)
    {
        QString output;
        for (int i = 0; i < num; ++i)
        {
            if (i > 0)
            {
                output.append(", ");
            }
            output.append(QString::number(array[i]));
        }
        return output;
    };  //数字数组转字符串

};

#endif  // SKYSONYA_H

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

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

相关文章

大数据新视界 -- 大数据大厂之 Impala 性能飞跃:动态分区调整的策略与方法(上)(21 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Vue3 笔记 (万字速通)

此笔记来至于尚硅谷&#xff0c;仅供笔者复习使用 1. Vue3 简介 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;n&#xff09; 经历了&#xff1a;4800次提交、40个RFC、600次PR、300贡献者 官方发版地址&#xff1a;Rele…

Linux基础1

Linux基础1 Linux基础1学习笔记 ‍ 声明&#xff01; ​​​学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章 笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他…

Linux中.NET读取excel组件,不会出现The type initializer for ‘Gdip‘ threw an exception异常

组件&#xff0c;可通过nuget安装&#xff0c;直接搜名字&#xff1a; ExcelDataReader using ConsoleAppReadFileData.Model; using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Task…

320页PDF | 集团IT蓝图总体规划报告-德勤(限免下载)

一、前言 这份报告是集团IT蓝图总体规划报告-德勤。在报告中详细阐述了德勤为某集团制定的全面IT蓝图总体规划&#xff0c;包括了集团信息化目标蓝图、IT应用规划、数据规划、IT集成架构、IT基础设施规划以及IT治理体系规划等关键领域&#xff0c;旨在为集团未来的信息化发展提…

乐维网管平台(六):如何正确管理设备端口

一、什么是端口下联 在网络环境中&#xff0c;端口下联是指网络设备&#xff08;通常是交换机&#xff09;的端口与其他设备相连接的一种网络架构关系。交换机作为网络中的核心连接设备&#xff0c;其端口下联可以连接多种类型的终端设备&#xff0c;如计算机、服务器、IP 电话…

迁移学习相关基础

迁移学习 目标 将某个领域或任务上学习到的知识或模式应用到不同但相关的领域或问题中。 主要思想 从相关领域中迁移标注数据或者知识结构、完成或改进目标领域或任务的学习效果。 概述 Target data&#xff1a;和你的任务有直接关系的数据&#xff0c;但数据量少&#xff…

Diffusion Policy——斯坦福机器人UMI所用的扩散策略:从原理到其编码实现(含Diff-Control、ControlNet详解)

前言 本文一开始是属于此文《UMI——斯坦福刷盘机器人&#xff1a;从手持夹持器到动作预测Diffusion Policy(含代码解读)》的第三部分&#xff0c;考虑后Diffusion Policy的重要性很高&#xff0c;加之后续还有一系列基于其的改进工作 故独立成本文&#xff0c;且写的过程中 …

麒麟V10,arm64,离线安装docker和docker-compose

文章目录 一、下载1.1 docker1.2 docker-compose1.3 docker.service 二、安装三、验证安装成功3.1 docker3.2 docker-compose 需要在离线环境的系统了里面安装docker。目前国产化主推的是麒麟os和鲲鹏的cpu&#xff0c;这块的教程还比较少&#xff0c;记录一下。 # cat /etc/ky…

接口测试整体框架

接口测试 1. 接口 接口&#xff0c;也叫api&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;&#xff0c;接口&#xff08;Interface&#xff09;是指不同软件组件或系统之间进行交互的点。接口定义了组件之间如何通信&#xff0c;包括…

2024 ECCV | DualDn: 通过可微ISP进行双域去噪

文章标题&#xff1a;《DualDn: Dual-domain Denoising via Differentiable ISP》 论文链接&#xff1a; DualDn 代码链接&#xff1a; https://openimaginglab.github.io/DualDn/ 本文收录于2024ECCV&#xff0c;是上海AI Lab、浙江大学、香港中文大学&#xff08;薛天帆等…

AI制作ppt

1&#xff0c;kimi&#xff1a; 实际上也是AiPPT.cn这个网站&#xff08;但是有实际次数限制&#xff09; 2&#xff0c;其余专业AI ppt生成网站&#xff1a; &#xff08;1&#xff09;gamma&#xff1a;https://gamma.app/ 大概能制作7~10页左右 free的ppt&#xff0c;其余要…

10款PDF翻译工具的探索之旅:我的使用经历与工具特色!!

在如今的时代&#xff0c;PDF文件已经成为我们工作、学习和生活中不可或缺的一部分。但是&#xff0c;当遇到一些非母语或陌生语言的PDF文档时&#xff0c;这要怎么办呀&#xff01;这时候翻译工具就显得尤为重要了。这也是我所遇到过的难题&#xff0c;现在我将与大家分享几款…

【java】java通过s3访问ceph报错

1.报错信息、背景 工作中起了几个访问ceph的服务pod节点&#xff0c;一段时间后1个节点一直报错Unable to execute HTTP request: Timeout waiting for connection from pool&#xff0c;详细i信息如下图片&#xff0c;有且仅有1个节点报错&#xff0c;其他节点访问正常。看日志…

飞牛私有云访问外网

飞牛私有云 fnOS NAS 是一款有着卓越的性能以及强大的兼容性和智能化的管理界面&#xff0c;它之所以能在 NAS 市场中脱颖而出&#xff0c;是因为 fnOS 基于最新的 Linux 内核&#xff08;Debian发行版&#xff09;深度开发&#xff0c;不仅兼容主流 x86 硬件&#xff0c;还支持…

【iOS】知乎日报第三周总结

【iOS】知乎日报第三周总结 文章目录 【iOS】知乎日报第三周总结前言评论区文字评论区的一个展开效果评论区数据的一个请求修改了主页获取数据的逻辑主页无限轮播图图片主色调的一个获取将一些拓展部分的内容写在分类里小结 前言 本周笔者因为金工实习整个项目进展比较慢&#…

局域网到公网的飞跃:LocalSend + Cpolar让文件传输再无边界

前言 本篇教程主要分享如何在Windows系统中部署开源免费文件传输工具LocalSend&#xff0c;并且结合cpolar内网穿透将其发布至公网实现远程使用进行文件下载传输。localsend是一款基于局域网的文件传输工具&#xff0c;它利用局域网的高速传输特性&#xff0c;实现了设备之间的…

1.62亿元!812个项目立项!上海市2024年度“科技创新行动计划”自然科学基金项目立项

本期精选SCI&EI ●IEEE 1区TOP 计算机类&#xff08;含CCF&#xff09;&#xff1b; ●EI快刊&#xff1a;最快1周录用&#xff01; 知网(CNKI)、谷歌学术期刊 ●7天录用-检索&#xff08;100%录用&#xff09;&#xff0c;1周上线&#xff1b; 免费稿件评估 免费匹配期…

大数据应用开发——实时数据处理(一)

前言 大数据应用开发——实时数据采集 大数据应用开发——实时数据处理 Flink完成Kafka中的数据消费&#xff0c;将数据分发至Kafka的dwd层中 并在HBase中进行备份 大数据应用开发——数据可视化 hadoop&#xff0c;zookeeper&#xff0c;kafka&#xff0c;flink要开启 目…

QT版发送邮件程序

简单的TCP邮箱程序 **教学与实践目的&#xff1a;**学会网络邮件发送的程序设计技术。 1.SMTP协议 邮件传输协议包括 SMTP&#xff08;简单邮件传输协议&#xff0c;RFC821&#xff09;及其扩充协议 MIME&#xff1b; 邮件接收协议包括 POP3 和功能更强大的 IMAP 协议。 服务…