首页 > 其他分享 >文件批量转UTF8

文件批量转UTF8

时间:2024-07-15 19:28:36浏览次数:12  
标签:origin read UTF8 源文件 QTextCodec 文件批量 type

源代码:https://github.com/qianqiu10000/toUTF8.git

使用Qt Creator开发时经常会碰到乱码的头文件,这个小工具可以将.h/.cpp文件批量转成UTF8格式。使用时将exe文件复制到要转换的文件目录,会在该目录下生成一个UTF8文件夹,转换后的文件都在这里。

上一版测试后有点问题,现在增加几种文件格式。

有个其他人没提过的问题,就是文件开头都是ACSII码,没法通过QTextCodec转换功能来区分文件格式,实测多种格式的ACSII字符都能转换成功。所以代码里增加跳过ACSII码功能。

#include<QFile>
#include<QDir>
#include<QTextCodec>
#include<QTextStream>


enum Type {
    ANSI,
    UTF8,
    UTF8BOM,
    UTF16LE,
    UTF16BE
};

bool translateFile(const QString &file)
{
    //打开源文件
    QFile origin(file);
    if(!origin.open(QFile::ReadOnly))
    {
        return false;
    }

    //如果源文件是空的
    if(origin.atEnd()) {
        return false;
    }

    //在源文件路径下创建一个UTF8文件夹,
    QFileInfo info(origin);
    QDir dir = info.dir();
    if(!dir.exists("UTF8")) {
        dir.mkdir("UTF8");
    }

    //目标文件放在上面的UTF8文件夹里,名字与源文件相同
    info.fileName();
    QString to = dir.path() + "/UTF8/" + info.fileName();
    QFile target(to);
    if(!target.open(QFile::WriteOnly))
    {
        origin.close();
        return false;
    }

    //判断源文件类型,默认UTF8
    Type type = UTF8;

    //前三个字节判断一下
    QByteArray utf = origin.read(3);
    quint8 byte0 = utf.at(0);
    quint8 byte1 = utf.at(1);
    quint8 byte2 = utf.at(2);

    origin.reset();
    //如果是UTF16LE编码
    if(byte0 == 0xFF && byte1 == 0xFE) {
        type = UTF16LE;
    }
    else if(byte0 == 0xFE && byte1 == 0xFF) {
        type = UTF16BE;
    }
    else if(byte0 == 0xEF && byte1 == 0xBB && byte2 == 0xBF) {
        type = UTF8BOM;
    }
    else {                                              //如果没有特征字节,需要试错
        //把ACSII字符跳过, 值[0,127]各种编码通用,难以判断
        qint64 num = 0;
        char byte = 0;
        while ((!origin.atEnd()) && (byte <= 127) && byte >= 0) {
            byte = origin.read(1).at(0);
            num++;
        }

        //如果文件不在结尾,说明含有非ACSII码字符,一般是中文
        if(!origin.atEnd())
        {
            QTextCodec *codec = QTextCodec::codecForName("UTF-8");
            //根据前3个字节判断
            origin.seek(num - 1);
            QByteArray header = origin.read(3);
            QTextCodec::ConverterState state;
            codec->toUnicode(header.data(), header.size(), &state);

            //UTF8汉字三字节编码,如果无效字符数大于0,说明不是UTF8
            if(state.invalidChars) {
                type = ANSI;
            }

        }
    }

    origin.reset();
    //编码转换,一行一行进行
    switch (type) {
        case UTF16LE:
            {
                QTextStream read(&origin);
                read.setCodec(QTextCodec::codecForName("UTF-16LE"));
                QTextStream write(&target);
                write.setCodec(QTextCodec::codecForName("UTF-8"));
                write << read.readAll();
            }
            break;
        case UTF16BE:
            {
                QTextStream read(&origin);
                read.setCodec(QTextCodec::codecForName("UTF-16BE"));
                QTextStream write(&target);
                write.setCodec(QTextCodec::codecForName("UTF-8"));
                write << read.readAll();
            }
            break;
        case ANSI:
            {
                QTextStream read(&origin);
                read.setCodec(QTextCodec::codecForLocale());
                QTextStream write(&target);
                write.setCodec(QTextCodec::codecForName("UTF-8"));
                write << read.readAll();
            }
            break;
        case UTF8BOM:
            {
                QTextStream read(&origin);
                read.setCodec(QTextCodec::codecForName("UTF-8"));
                read.setGenerateByteOrderMark(true);
                QTextStream write(&target);
                write.setCodec(QTextCodec::codecForName("UTF-8"));
                write << read.readAll();
            }
            break;
        default:
            while(!origin.atEnd()) {
                target.write(origin.readLine());
            }
    }

    target.close();
    origin.close();

    return true;
}

int  main()
{

    QDir dir;
    QFileInfoList infos = dir.entryInfoList(QDir::Files);

    QStringList files;
    for(int i = 0; i < infos.count(); i++)
    {
        QFileInfo info = infos.at(i);
        QString suffix = info.suffix();
        if(suffix == "h" || suffix == "cpp" || suffix == "c") {
            files.append(info.absoluteFilePath());
        }
    }

    for(int i = 0; i < files.count(); i++)
    {
        translateFile(files.at(i));
    }

    return 0;
}

标签:origin,read,UTF8,源文件,QTextCodec,文件批量,type
From: https://blog.csdn.net/weixin_69505365/article/details/140321888

相关文章

  • md文件批量转html
    1.requirements.txtbeautifulsoup4==4.12.3Markdown==3.62.main.pyimportmarkdownimportosimportshutilfrombs4importBeautifulSoupimportuuidimportargparsedefmd2html(src_folder,dest_folder):foriteminos.listdir(src_folder):......
  • 创建数据库时排序规则utf8_general_ci与utf8_bin的区别
    在MySQL数据库中,字符集(如utf8)定义了字符如何存储,而排序规则(Collation)则定义了字符如何比较、排序和区分大小写。utf8_general_ci和utf8_bin是两种常用的UTF-8字符集下的排序规则,它们之间的主要区别如下:utf8_general_ci全称:case-insensitive,意为“不区分大小写”。特点:在比较......
  • 编码格式UTF8下中文长度
    首先理解一下基本概念,字符:一种符号,ABCD,中文,都是文字符号,所以叫字符字节:Byte简写B,跟字节跳动ByteDance一个东西。计算机的基本存储单位二进制位:bit(BinaryDigits)简写b,是比特币BitCoin的bit一个东西,计算机最小传输单位---0/1三者对应关系如下表:字符一个中文或标点一个......
  • 如何给excel文件批量加密?给excel文件批量加密的四个方法
    在Excel当中我们如何对表格文档进行加密,其实在Excel表格当中对文档加密的方式一共有两种,一种是密码加密;另一种是账号加密。那么今天我们就先来讲讲密码加密是怎么一回事儿,之后再给大家讲解一下账号加密的操作方式。对于密码加密,在平时的Excel办公当中,我们的文档不想让别人查看......
  • ASCII 码表 unicode表 utf8表
     ASCII码表只包含0到127的字符表示,用单个字节即可表示。而对于超过127的字符,比如0x9A,无法用ASCII码表表示。对于超过ASCII码表的字符,可以使用其他字符编码表来表示,如Unicode编码表。Unicode是一种用于表示所有字符的标准编码系统,它包含了全球范围内的字符集,......
  • 抖音验证签名和接口含中文签名,需要在发送端加上utf8编码
    抖音验证签名和接口含中文签名,需要在发送端加上utf8编码抖音验签和抖音异步通知回调验签解决:是对整个接收的字符串做验签,而不是部分数据做验签解决中文参数问题,否则中文乱码报验签错误 签名算法https://developer.open-douyin.com/docs/resource/zh-CN/mini-app/develop/serve......
  • 轻松实现文件批量迁移至多个位置!
    在数字信息化办公中,文件如同知识的使者,穿梭于各个角落,或聚集在特定的文件夹。随着工作的深入和资料的积累,我们经常需要将这些文件进行批量迁移,以实现更好的组织和管理。不过,传统的文件复制方式往往耗时费力,所以小编今天就来帮助大家轻松实现轻松实现文件批量迁移至多个位置。让......
  • 视频文件批量更换名称的方法有哪些?分享4个高效的方法
    我们有一大批视频文件需要重新命名时,手动一个一个地操作显然非常低效。为了解决这个问题,我们可以借助一些工具来实现批量重命名操作。下面分享4个高效的方法,帮助你快速完成大量视频文件的重命名方法一:使用【汇帮批量重命名】以下是具体的操作步骤:1:下载并安装“汇帮批量重命......
  • c++在Linux下把gbk编码转为utf8编码类型
    #include<iostream>#include<string.h>#include<iconv.h>#include<memory>std::stringgbk_to_utf8(conststd::string&gbk_str){size_tin_len=gbk_str.size();size_tout_len=in_len*4;//设置足够大,确保可以存放转换后的UTF-8字符串std::uni......
  • 压缩包文件批量解压助手工具
    压缩包文件批量解压助手工具主要用于批量化解压压缩包文件,省去了繁琐的人工操作主要包含以下功能:自动获取文件夹内所有压缩包文件(支持:zip、tar、7z、uvz、rar格式)自动从密码本中匹配压缩包密码后自动解压压缩包支持解压完成后自动删除压缩包文件支持快速、标准、性能三种......