Qt文件编码转换工具(二) C++判断文件编码

583 篇文章 125 订阅
36 篇文章 23 订阅

目录

 

下载链接

上一节

如何判断文件编码

下一节


 

下载链接

Realase打包版本下载:

Qt文本转化工具 realase版本

https://download.csdn.net/download/qq78442761/10927836

 

Qt文件编码转换工具源码

https://download.csdn.net/download/qq78442761/10927834

 

上一节

Qt文件编码转换工具(一) 项目介绍

https://blog.csdn.net/qq78442761/article/details/86555753

程序运行截图如下:

 

如何判断文件编码

这一节来说明下文件编码,这里举一个UTF-8的例子!

在Windows端,创建一个txt文件,空文件,这里Windows会自动把他判断为ASCII编码!

此时的文件大小:

如果把他给成UTF-8编码,此时还是空文件,但还是有3字节:

现在以十六进制看看这文件:

这里就可以知道如何判断了!

此时会多出一个文件头!!!通过这个文件头即可判断,这里来总结下其他编码:

 

ASCII非下面3个
UnicodeFF FE
Unicode big endian FF FF
UTF-8  EF BB BF

这里其实可以根据前面2个字节即可判断!

 

下面来看看Qt源码:

这里采用简单工厂,这里只给出了伪代码,要源码请在博文上面下载:

filetype.h

#ifndef FILETYPE_H
#define FILETYPE_H

#include <QString>
#include <QDebug>

class FileType{

public:

    virtual QString getFileType(){ return ""; }
    virtual ~FileType(){ qDebug() << "FileType disconstraction called!"; }
};

class ASCIIFileType: public FileType{

public:
    QString getFileType() override{

        return "ANSI";
    }
};

class UTF8FileType: public FileType{

public:
    QString getFileType() override{

        return "UTF-8";
    }
};

class UniFileType: public FileType{

public:
    QString getFileType() override{

        return "Unicode";
    }
};

class UniEndFileType: public FileType{

public:
    QString getFileType() override{

        return "Unicode big endian";
    }
};

class FileTypeFactory{

public:

    static FileType *createFileTypeFactory(QByteArray byteArray){

        FileType *fileType;

        if(byteArray == "\xEF\xBB"){    //UTF-8

            fileType = new UTF8FileType;
        }
        else if(byteArray == "\xFF\xFE"){       //Unicode

            fileType = new UniFileType;
        }
        else if(byteArray == "\xFE\xFF"){       //Unicode big endian

            fileType = new UniEndFileType;
        }
        else{

            fileType = new ASCIIFileType;
        }


        return fileType;
    }
};


#endif // FILETYPE_H

下面给出一个调用的代码:

void DisposeFile::transformFile(const QString &sourceFile)
{
    QFile file(sourceFile);
    if(!file.open(QIODevice::ReadOnly)){

        qDebug() << "open failed!";
        return;
    }

    QByteArray byteArray = file.readAll();
    //qDebug() << "byteArray:" << QString::frombyteArray;

    FileType *fileType = FileTypeFactory::createFileTypeFactory(byteArray.left(2));

    GenDialog *genDialog = new GenDialog(NULL ,m_currentFileName, fileType->getFileType());
    if(genDialog->exec() == QDialog::Accepted){

        QString head = genDialog->getArmStr();

        saveFile(head, fileType->getFileType(),byteArray);
    }
    delete genDialog;

    delete fileType;

    file.close();
}

 

如何实现UTF8和ASCII之间的编码转换!

通过Qt的QString中QString::fromLocal8Bit和QStirng::fromUtf8即可:

    if(head == "ASCII"){

        if(sourceCode == "UTF-8"){

            file.write(QString::fromUtf8(data).toStdString().c_str());
        }
        else{

            file.write(QString::fromLocal8Bit(data).toStdString().c_str());
        }
    }
    else{

        if(sourceCode == "UTF-8"){

            file.write("\xEF\xBB\xBF");
            file.write(QString::fromUtf8(data).toStdString().c_str());
        }
        else{

            file.write("\xEF\xBB\xBF");
            file.write(QString::fromLocal8Bit(data).toStdString().c_str());
        }
    }

 

下一节

下一节将给出Qt界面设计

https://blog.csdn.net/qq78442761/article/details/86556068

  • 35
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值