项目场景:
项目中,需要在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平台上,您可能需要使用交叉编译器来构建库。以下是本项目的编译步骤:
- 解压后
- mkdir build
- cd build
- cmake …/
- source source /opt/sl8541e_sdk_zyb/environment-setup-armv7ahf-vfp-unisoc-linux-gnueabi
- make
然后把生成的.h和 .so拷贝到目标平台即可