目录
下载链接
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个 |
Unicode | FF 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界面设计