相关文章推荐

小弟我在在上一篇 Qt中QFile类读取ansi编码格式txt文件,在QTextEdit控件中显示乱码
文章中聊到如何读取ANSI和UFT-8文件,但有个前提是首先知道txt文件的编码格式,如何程序中我们事先不知道txt文件的编码格式那我们怎么做呢?下面我和大家就来聊聊如何判断文件的编码格式

一、判断txt文件编码格式

Qt提供了一个类QTextCodec类,专门用来对字符串进行不同编码方式的转换。
其中重要的两个静态方法是:fromUnicode和toUnicode。
通过这两个静态方法可以将其他类型(如gbk)的字符串转换为utf-8字符串(采用toUnicode),或者将utf-8的字符串转换为其他类型(如gbk)的字符串(采用fromUnicode)。
基本原理是:拿到一定长度的 字节流 然后判断含有哪些 byte 就知道是什么东西了,如果是文本文件,先尝试读前两个字节,看是否是BOM,windows,Qt对字符串默认是采用utf-8编码的,如果要打开gbk的文件,依然采用utf-8编码的话,当然就不识别了,显示就是乱码。
读取txt文件时,很多时候无法获取文件的编码格式.如果直接进行使用,则有可能出现乱码.需要在使用前将其转为Unicode(Qt的默认编码格式). 虽然实际的编码格式种类非常多,但平常主要使用的有GBK与UTF-8两种.可以依次尝试转换,如果转换出现无效字符则认为不是该种编码格式. QString GetCorrectUnicode(const QByteArray &ba) { QTextCodec::ConverterState state; QTextCodec *codec = QText

二、解决方法

enum class EncodingFormat : int
    ANSI = 0,//GBK
    UTF16LE,
    UTF16BE,
    UTF8,
    UTF8BOM,
EncodingFormat ProjectWin::FileCharacterEncoding(const QString &fileName)
    //假定默认编码utf8
    EncodingFormat code = EncodingFormat::UTF8;
    QFile file(fileName);
    if (file.open(QIODevice::ReadOnly))
            //读取3字节用于判断
            QByteArray buffer = file.read(3);
            quint8 sz1st = buffer.at(0);
            quint8 sz2nd = buffer.at(1);
            quint8 sz3rd = buffer.at(2);
            if (sz1st == 0xFF && sz2nd == 0xFE)
                code = EncodingFormat::UTF16LE;
            else if (sz1st == 0xFE && sz2nd == 0xFF)
                code = EncodingFormat::UTF16BE;
            else if (sz1st == 0xEF && sz2nd == 0xBB && sz3rd == 0xBF)
                code = EncodingFormat::UTF8BOM;
                //尝试用utf8转换,如果无效字符数大于0,则表示是ansi编码
                QTextCodec::ConverterState cs;
                QTextCodec* tc = QTextCodec::codecForName("utf-8");
                tc->toUnicode(buffer.constData(), buffer.size(), &cs);
                code = (cs.invalidChars > 0) ? EncodingFormat::ANSI : EncodingFormat::UTF8;
            file.close();
    return code;
void ProjectWin::readParaFile(QString filePath)
//读取ansi编码格式文件
    m_paraText->clear();
    if (!m_paraText) {
        qDebug() << "m_paraText is null!";
        return;
//    filePath = "E:/work/ImageManageSys/utf8/0000_051623_162252_05_004_00001_00008_00.txt";
    EncodingFormat code = FileCharacterEncoding(filePath);
    qDebug() << "code=" << (int)code;
	//读取ANSI编码格式文件
    if(code == EncodingFormat::ANSI)
        QString txtFile = filePath.left(filePath.size() -3);
        txtFile += "txt";
        QFile file(filePath);
        if(file.open(QIODevice::ReadOnly)) {
    //        qDebug() << file.errorString();
            QTextCodec::setCodecForLocale(QTextCodec::codecForName("gb2312"));//中文转码声明
            QString temStr;
            while(!file.atEnd())
                    QByteArray arr = file.readAll();
                    arr.replace(0x0B,0x0D);
                    temStr = QString::fromLocal8Bit(arr, arr.length());//Window下的QByteArray转QString
                    m_paraText->append(temStr);
            //读取任务号
            while (!file.atEnd())
               QString line = file.readLine();
               if(line.contains(u8"任务代号:", Qt::CaseSensitive))
                    int pos = line.lastIndexOf(":");
                    QString taskNum = line.right(line.size() - pos - 2);
                    taskNum = taskNum.trimmed();
                    m_taskNumSet.insert(taskNum);
                    break;
           file.close();
    //读取UTF-8编码格式文件
    if(code == EncodingFormat::UTF8)
       //读取utf8编码格式
       m_paraText->clear();
           if (!m_paraText) {
               qDebug() << "m_paraText is null!";
               return;
           QString txtFile = filePath.left(filePath.size() -3);
           txtFile += "txt";
           QFile file(filePath);
           if(!file.open(QIODevice::ReadOnly)) {
               qDebug() << file.errorString();
           QTextStream in(&file);
           in.setCodec("UTF-8");  // 设置编码为UTF-8
           QString chineseText;
           while(!in.atEnd()) {
               QString line = in.readLine();
               if(line.contains(u8"任务代号:", Qt::CaseSensitive))
                   int pos = line.lastIndexOf(":");
                   QString taskNum = line.right(line.size() - pos - 2);
                   taskNum = taskNum.trimmed();
                   m_taskNumSet.insert(taskNum);
       //            break;
               m_paraText->append(line); // 添加到QTextEdit控件中
           file.close();

hellokandy

解决方法用QTextStream来读写文本 QTextStream in(&file); in.setCodec("UTF-8"); // 设置文件编码格式UTF-8 QString line = in.readLine(); // 此时以UTF-8的方式从文件读取内容,结果正常
文件IO操作开发笔记(一):使用Qt的QFile对磁盘文件存储进行性能测试以及测试工具》 https://hpzwl.blog.csdn.net/article/details/128438303 在做到个别项目对日志要求较高,要求并行写入的数据较多,尽管写入数据的线程放在子线程,仍然会造成界面程序的假死(实际上Qt还是在跑
Qt5.9开发的文件编码转换。该工具我用来在Windows7下面VS2015编译器与MinGW编译器编码转换。MinGW编译器使用UTF-8编码,VS2015使用GB2312编码。 预编译头文件缺失,将头文件替换为 #include #include #include #include #include #include #include #include #include #include #include #include
19 QFile文件读写操作19.1 前期准备19.1.1 项目创建19.1.2 界面搭建19.2 QFile文件读写19.2.1 QFile文件读操作19.2.2 QFile文件写操作19.3 QFileInfo文件信息   代码资源:https://download.csdn.net/download/qq_36926037/85060408 19.1 前期准备 19.1.1 项目创建    创建项目,详细过程步骤:https://blog.csdn.net/qq_36926037/article/de
(1)源文件“main.cpp”的具体实现代码如下: 其, (a) if(data.open(QFile::WriteOnly|QFile::Truncate)):参数QFile::Truncate表示将原来文件的内容清空。输出时将格式设为左对齐,占10个字符位置。 (b) out<<QObject::tr("score:")<<qSetFieldWidth(10)<<left<<90<<endl:用户使用格式化函数和流操作符设置需要的输出格式。其,qSetFieldWidth()函数是设置字段宽度的格式化函数。除此之外,QTextStream还提供了其他一些格式化函数,见表9.1。
直接上代码,函数主要是SumatraPDF配置文件的语言 void XXXApi::ChangeSumatraPDFSettingFileUiLanguage(const QString &file_name, const QString &des_lan) //SumatraPDF支持命令行切换语言,但实际运行效果不稳定,所以通过修改配置文件来切换SumatraPDF语言。 QFile txt_file(file_name); bool bopenfile = txt_file
QFile* m_pLogFile; m_pLogFile = new QFile("./log.txt"); QString msgStr = "文"; QString msgStr2 = ChString("test result2"); QString msgStr3 = QStringLiteral("文3"); m_pLog...
#include <QByteArray> void convertFileEncoding(const QString& filePath, const QString& fromEncoding, const QString& toEncoding) QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) qDebug() << "Failed to open file: " << file.errorString(); return; QByteArray data = file.readAll(); file.close(); QTextCodec* fromCodec = QTextCodec::codecForName(fromEncoding.toUtf8()); QTextCodec* toCodec = QTextCodec::codecForName(toEncoding.toUtf8()); QString str = fromCodec->toUnicode(data); QByteArray utf8Data = toCodec->fromUnicode(str); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) file.write(utf8Data); file.close(); qDebug() << "File encoding converted successfully."; qDebug() << "Failed to open file: " << file.errorString(); 你可以调用 `convertFileEncoding` 函数来实现将指定路径的文件从指定的编码格式转换为UTF-8编码。需要传入文件路径、源编码格式和目标编码格式作为参数。 注意:在使用该代码之前,请确保你已经包含了相应的头文件并链接了Qt的核心模块。 LogProperty:Error:FStructProperty::Serialize Loading:Property‘StructProperty/‘ Unknown structure UE4中无法保存项目问题 在UE4虚幻引擎中加入导航网格体边界体积后丧尸不能移动和发现玩家
 
推荐文章