qt 读取txt文本内容时,中文乱码

项目场景:

项目中,需要在TF卡中做类似txt阅读器的功能,因为app是在嵌入式系统下运行的,发现当读取txt的文本格式为ANSI时,中文的显示是乱码,故记录下解决方法

问题解决

中文乱码问题还是涉及到编码问题,txt的编码格式有ANSI和 utf-8等种类,那就需要读取txt文档时,按照文档的编码类型去读取。

1、获得txt文档的编码格式

Qt本身并没有直接的方法来确定文本文件的编码格式。通常,文本文件的编码格式是通过分析文件内容来确定的。有一些第三方库和工具可以帮助你检测文本文件的编码格式。

一个常用的开源库是libiconv,它提供了许多文本编码相关的功能。你可以使用libiconv来尝试不同的编码,看看哪个编码能够正确地解析文本文件。

另外,还有一些命令行工具,如enca和chardet,可以用于检测文本文件的编码格式。你可以通过在Qt中调用这些命令行工具来获取文件的编码格式。

以下是一个使用chardet命令行工具来检测文本文件编码格式的示例代码:

#include <uchardet.h>QString detectFileEncoding(const QString& filePath)
{QFile file(filePath);if (!file.open(QIODevice::ReadOnly)) {qDebug() << "Failed to open file:" << file.errorString();return QString();}QByteArray data = file.readAll();uchardet_t ud = uchardet_new();uchardet_handle_data(ud, data.constData(), data.size());uchardet_data_end(ud);const char* encoding = uchardet_get_charset(ud);QString detectedEncoding = QString::fromLatin1(encoding);uchardet_delete(ud);file.close();return detectedEncoding;
}
void FileReader::openFile(const QString &path)
{QString detectedEncoding = detectFileEncoding(path);qWarning() << __func__ << detectedEncoding;m_file.setFileName(path);if(m_file.open(QIODevice::ReadOnly | QIODevice::Text)){m_in.setDevice(&m_file);m_in.setCodec(detectedEncoding.toUtf8());}m_curPos = 0;m_curLine = 0;posInfoList.append(PosInfo(m_curPos,m_curLine));qDebug() << __func__;readNextPage();
}

2、ucharDet库的集成方法

要在ARM平台上集成uchardet库,您可以按照以下步骤进行操作:

获取uchardet库源代码:您可以访问uchardet的官方网站或源代码仓库,下载最新的uchardet库源代码。

编译uchardet库:进入uchardet库的源代码目录,并执行编译命令。

从官网https://www.freedesktop.org/wiki/Software/uchardet/

下载源码https://www.freedesktop.org/software/uchardet/releases/

=================================================================================

在ARM平台上,您可能需要使用交叉编译器来构建库。以下是本项目的编译步骤:

  1. 解压后
    在这里插入图片描述
  2. mkdir build
  3. cd build
  4. cmake …/
  5. source source /opt/sl8541e_sdk_zyb/environment-setup-armv7ahf-vfp-unisoc-linux-gnueabi
  6. make

然后把生成的.h和 .so拷贝到目标平台即可

一切搞定

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

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

相关文章

【C++】继承 ⑦ ( 继承中的对象模型分析 | 继承中的构造函数和析构函数 )

文章目录 一、继承中的对象模型分析1、继承代码示例2、基类与派生类内存模型3、问题引入 - 派生类对象构造函数和析构函数调用4、完整代码示例 - 派生类对象内存模型 二、继承中的构造函数和析构函数1、子类构造函数与析构函数调用顺序2、子类构造函数参数列表3、代码示例 - 继…

【word技巧】word页眉,如何禁止他人修改?

我们设置了页眉内容之后&#xff0c;不想其他人修改自己的页眉内容&#xff0c;我们可以设置加密的&#xff0c;设置方法如下&#xff1a; 先将页眉设置好&#xff0c;退出页眉设置之后&#xff0c;我们选择布局功能&#xff0c;点击分隔符 – 连续 设置完之后页面分为上下两节…

【Mysql】B+树索引的使用(七)

前言 每个索引都对应一棵 B 树&#xff0c; B 树分为多层&#xff0c;最下边一层是叶子节点&#xff0c;其余的是内节点&#xff08;非叶子节点&#xff09;。所有用户记录都存储在 B 树的叶子节点&#xff0c;所有目录项记录都存储在内节点。 InnoDB 存储引擎会自动为主键&am…

vue单向绑定和双向绑定

一、单向绑定就是&#xff1a;修改视图&#xff0c;数据不变&#xff1b;修改数据&#xff08;app.name"1234"&#xff09;&#xff0c;视图会变 二、双向绑定&#xff1a;修改视图&#xff0c;数据会变&#xff1b;修改数据&#xff0c;视图会变 demo&#xff1a; …

C# 文件 校验:MD5、SHA1、SHA256、SHA384、SHA512、CRC32、CRC64

文件 校验 算法&#xff1a;MD5、SHA1、SHA256、SHA384、SHA512、CRC32、CRC64 (免费) 编程语言&#xff1a;C# 功能&#xff1a;文件 哈希 属性 校验算法&#xff1a;MD5、SHA1、SHA256、SHA384、SHA512、CRC32、CRC64。 下载&#xff08;免费&#xff09;&#xff1a;htt…

计算机毕业设计 基于SpringBoot笔记记录分享网站的设计与实现 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Maven 生命周期clean default size含义

clean 负责清理工作&#xff0c;清理上一次项目构建产生的一些文件&#xff0c;如编译后的字节码文件&#xff0c;打包后的jar包文件 default 整一个项目构建的核心工作&#xff0c;如编译&#xff0c;测试&#xff0c;打包&#xff0c;安装&#xff0c;部署等等 size 生成报告…

单链表的实现(全注释promax版)

目录 前言&#xff1a; 哨兵位&#xff1a; 链表的概念 链表的相关操作&#xff1a; 链表的创建&#xff1a; 打印链表&#xff1a; 申请新节点&#xff1a; 链表的尾插&#xff1a; &#xff01;&#xff01;&#xff01;对于传参中二级指针的解释&#xff1a; 链表的…

浅析人脸活体检测技术的功能及几种分类

在日常生活工作中&#xff0c;出现了人脸验证、人脸支付、人脸乘梯、人脸门禁等等常见的应用场景。这说明人脸识别技术已经在门禁安防、金融行业、教育医疗等领域被广泛地应用&#xff0c;人脸识别技术的高速发展与应用同时也出现不少质疑。其中之一就是人脸识别很容易被照片、…

还在为 Dubbo 服务写 Controller?因为未使用 ShenYu 网关

Dubbo 是一款高性能、轻量级的开源 Java RPC 框架&#xff0c;它可以帮助开发人员快速构建分布式服务。在 Dubbo 应用中&#xff0c;我们经常需要提供 HTTP 调用&#xff0c;如供 H5、外部系统等调用。一般的做法是为需要提供 HTTP 调用的服务编写 Controller&#xff0c;但这并…

2023.10.18

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();private slot…

[Docker]一.Docker 简介与安装

一、Docker简介与为什么要用 Docker 1.1、Docker 介绍 Docker 是一个跨平台的开源的 应用容器引擎 &#xff0c;诞生于 2013 年初&#xff0c;基于 Go语言 并遵从 Apache2.0 协议开源, Docker 可以把它理解成虚拟机&#xff0c;但是 Docker 和传统虚拟化方式 有所不同 …