Qt实现的gbk/utf8无bom文本转码小工具

时间:2022-11-18 16:06:36

1、用到了QDir QDirIterator 递归文件目录

2、QTextStream 以某种编码格式读取文本保存到QString,然后以另一种编码格式保存文本

3、界面很简单,如下:

Qt实现的gbk/utf8无bom文本转码小工具

#include "widget.h"
#include "ui_widget.h"

#include <QFile>
#include <QFileInfo>
#include <QTextCodec>
#include <QTextStream>
#include <QDir>
#include <QDirIterator>
#include <QFileDialog>

Widget::Widget(QWidget *parent) :QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    // 添加编码
    QStringList items;
    items << "UTF-8"<<"GBK";

    ui->comboBoxCodecSource->clear();
    ui->comboBoxCodecDest->clear();

    ui->comboBoxCodecSource->addItems(items);
    ui->comboBoxCodecSource->setCurrentText("GBK");

    ui->comboBoxCodecDest->addItems(items);
    ui->comboBoxCodecDest->setCurrentText("UTF-8");

    m_strTrPath = "";//目录路径
}

Widget::~Widget()
{
    delete ui;
}

void Widget::on_btnProject_clicked()
{
    static QString strDir = "d:/";//初始目录
    strDir = QFileDialog::getExistingDirectory(this, tr("选择目录"),
                                               strDir,
                                               QFileDialog::ShowDirsOnly |
                                               QFileDialog::DontResolveSymlinks);
    // 选择工程目录
    if (!strDir.isEmpty())
    {
        m_strTrPath = strDir;
        ui->labelStatus->setText(QString("选择目录[%1]").arg(strDir));
    }
    else
        strDir = "d:/";
}

void Widget::on_btnChange_clicked()//点击开始转换按钮
{

    QDir dir (m_strTrPath);
    QDirIterator dirIterator(m_strTrPath,
                             QDir::AllDirs | QDir::NoSymLinks | QDir::NoDotAndDotDot,
                             QDirIterator::Subdirectories);

    ui->textBrowser->clear();

   do  {

        QStringList filters;
        filters << "*.pro" << "*.cpp" << "*.h";

        dir.setPath(m_strTrPath);
        ui->textBrowser->append(QString("<span style=\" color:#FF0000;\">进入目录:</span> [ %1 ] <br>").arg(m_strTrPath));
        // 转换文件
        foreach (QFileInfo fileInfo, dir.entryInfoList(filters))
            changeTextcodec(fileInfo.absoluteFilePath()); // 转换编码

    } while (dirIterator.hasNext()&&(m_strTrPath = dirIterator.next())!="");

}

void Widget::changeTextcodec(QString fileName)//改变文本编码的关键代码,fileName是带路径的文件名
{
    QFile fileRead(fileName);
    fileRead.open(QIODevice::ReadOnly);

    QTextStream out(&fileRead);

    //这一句需要知道文本当前的编码格式
    out.setCodec(QTextCodec::codecForName(ui->comboBoxCodecSource->currentText().toLatin1()));
    out.setAutoDetectUnicode(true);

    QString strTemp;

    QStringList strContents;

    while (!out.atEnd()) {
        strTemp = out.readLine();
        strContents << strTemp;
    }
    fileRead.close();

    QFile fielWrite(fileName);

    if (!fielWrite.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Truncate)) {
        ui->labelStatus->setText("文件打开失败!");
        return;
    }

    QTextStream in(&fielWrite);
    in.setCodec(QTextCodec::codecForName(ui->comboBoxCodecDest->currentText().toLatin1()));
    in.setAutoDetectUnicode(true);

    for (int i = 0; i < strContents.size(); i++)
        in << strContents.at(i) << endl;

    fielWrite.close();

    ui->textBrowser->append(QString("<span style=\" color:#0000FF;\">转换完成:</span> [ %1 ] <br>").arg(fileName));
}

代码下载地址:http://download.csdn.net/detail/bladeandmaster88/9747442