批量替换文件为UTF-8_会头痛的可达鸭的博客-程序员秘密_批量替换程序(utf-8版)

技术标签: C/C++  编码  VS工程  MFC  

下载地址:

https://pan.baidu.com/s/1L5_UCZ0y0uhRVEqkYn7BhA

工程下载地址:

https://pan.baidu.com/s/1y3tC0UQyvA3elYyewvP8Iw

主要代码

// Convert.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Convert.h"
#include <afxwin.h>
#include <string>
#include <iostream>

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#define _CRT_SECURE_CPP_OVERLOAD_SECURE_NAMES 1

// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

void recursiveFile(CString strFileType);
void convertGBToUTF8(CString strWritePath, const char* gb2312);


int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // 初始化 MFC 并在失败时显示错误
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: 更改错误代码以符合您的需要
        _tprintf(_T("错误: MFC 初始化失败\n"));
        nRetCode = 1;
    }
    else
    {
        //接受一个参数作为源代码文件的根目录
        TCHAR *lpszDirName = argv[0];
        CString strFileType = lpszDirName;
        
        int pos = strFileType.ReverseFind('\\');
        strFileType = strFileType.Left(pos);
        //递归此目录下的.h文件和.cpp文件,如果发现不是utf8编码则转换为utf8编码
        recursiveFile(strFileType);

    }

    return nRetCode;
}

void recursiveFile(CString strFileType)
{
    CFileFind finder;
    BOOL isFinded = finder.FindFile(strFileType);//查找第一个文件
    while (isFinded)
    {
        isFinded = finder.FindNextFile(); //递归搜索其他的文件
        if (!finder.IsDots()) //如果不是"."目录
        {
            CString strFoundFile = finder.GetFilePath();
            if (finder.IsDirectory()) //如果是目录,则递归地调用
            {
                CString strNextFileType;
                strNextFileType.Format(_T("%s\\*.*"), strFoundFile);
                recursiveFile(strNextFileType);
            }
            else
            {
                //如果是头文件或cpp文件
                if (strFoundFile.Right(4) == _T(".cpp") || strFoundFile.Right(2) == _T(".h") || strFoundFile.Right(4) == _T(".hpp")) {
                    CFile fileReader(strFoundFile, CFile::modeRead);
                    byte head[3];
                    fileReader.Read(head, 3);
                    //判断是否带有BOM文件头
                    if (head[0] == 0xef && head[1] == 0xbb && head[2] == 0xbf)
                    {
                        fileReader.Close();
                        continue;
                    }
                    fileReader.SeekToBegin();

                    int bufLength = 256;
                    char *buf = new char[bufLength];
                    ZeroMemory(buf, bufLength);
                    int nReadLength;
                    std::string strContent;
                    while ((nReadLength = fileReader.Read(buf, bufLength)))
                    {
                        strContent.append(buf, nReadLength);
                        ZeroMemory(buf, nReadLength);
                    }
                    delete buf;
                    fileReader.Close();
                    convertGBToUTF8(strFoundFile, strContent.c_str());

                    TCHAR* fileName = new TCHAR[strFoundFile.GetLength() + 1];
                    //wcscpy_s(*fileName, strFoundFile);

                    // 中文路径存在问题,可以将下面的输出屏蔽,程序将静默运行
                    printf("%S已经转换为UTF-8编码", strFoundFile.GetBuffer(0));
                    cout << endl;

                    if (_tcslen(fileName) > 0)
                    {
                        delete[] fileName;
                    }
                }
            }
        }
    }
    finder.Close();
}

void convertGBToUTF8(CString strWritePath, const char* gb2312)
{
    CFile fp;
    fp.Open(strWritePath, CFile::modeCreate | CFile::modeWrite | CFile::typeBinary, NULL);
    int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
    wchar_t* wstr = new wchar_t[len + 1];
    memset(wstr, 0, len + 1);
    MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
    len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
    char* str = new char[len + 1];
    memset(str, 0, len + 1);
    len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
    if (wstr) delete[] wstr;
    const unsigned char aryBOM[] = { 0xEF, 0xBB, 0xBF };
    fp.Write(aryBOM, sizeof(aryBOM));
    fp.Write(str, len - 1);
    delete[] str;
    fp.Close();
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_15821883/article/details/99293201

智能推荐

一段代码_大番薯_Jason的博客-程序员秘密

REPORT zmm_rp014.TABLES:afko,makt,mara,afpo,zprint1,marc,zsonghuo,mseg,zposo,vbkd,aufk,jest,zusr21.DATA edit(1) TYPE c.""消息框确认DATA: l_grid TYPE REF TO cl_gui_alv_grid.""ALV上按钮实时刷新内表DATA: line 

Python全国计算机等级考试(2021)_python计算n的32次方_Rui丸子的博客-程序员秘密

第三章 基本数据类型编程题1.获得用户输入的一个整数,输出该整数百位及以上数字。num=input('请输入一个整数:')if len(num)&lt;3: print('该整数无百位及以上的数字')else: print(num[:-2])2.获得用户输入的一个字符串,将字符串按空格分割,然后逐行打印出来。str=input("请输入一个字符串:")n=" ".join(str)for i in n: print(i)3.程序读

游戏服务器AI 之行为树(基于behavior designer)(一)_fm_VAE的博客-程序员秘密

前言AI应该是MMO类游戏服务器的一个主要模块,AI设计的好坏直接影响着游戏的品质。在现行的AI实现方案中,主要包括下面几大类方案一:有限状态机(FSM)顾名思义,就是列举出所有的状态,根据不同的状态去处理相应的逻辑例如游戏中的一般的小怪的AI:没有敌人的时候就执行巡逻动作发现敌人就攻击敌人攻击距离不够则追击超出最大的追击

利用Colab上的TPU训练Keras模型(完整版)_google colab tup训练_big91987的博客-程序员秘密

这里写自定义目录标题Colab的建立登录google云盘新建colaboratory运行colaboratoryColab的配置切换服务器模式 CPU/GPU/TPU设置笔记本显示行号执行linux命令文件加载文件的上传/下载挂载driver中的文件夹设置TPU加速colab的入口:driver.google.com功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入...

Spring Cloud系列三 之 Hystrix断路器_西魏陶渊明的博客-程序员秘密

声明本篇文章部分内容参考自 程序猿DD Spring Cloud系列书籍 断路器模式源于Martin Fowler的Circuit Breaker一文。“断路器”本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,“断路器”能够及时的切断故障电路,防止发生过载、发热、甚至起火等严重后果。在分布式架构中,断路器模式的作用就像是生活中家庭用电,一旦发生短路,就立马

威联通NAS配置NFS共享_威联通nas ftp 设置 nfs_fitnig的博客-程序员秘密

文档记录了威联通QTS系统配置NFS共享并通过CentOS系统挂载的过程。操作方法如下:1,登录到QTS。2,控制台–&gt;Win/Mac/NFS选项,在Linux NFS中开启NFS v3或NFSv4服务。3,FileStation文件总管中创建共享文件夹。创建后可在centos系统通过showmount命令看到。因未配置权限,此时不能挂载NFS,会提示访问被拒绝。4,控制台–&gt;共享...

随便推点

JAVA 串口编程 (三)_如果可以我愿争取的博客-程序员秘密

四、实例分析同API一起下载的还有一个examples文件,里面有个最简单的读、写程序,对其进行注释,以增进了理。(1)读串口 1 import java.io.*;2 import java.util.*;3 import javax.comm.*;4  5 public class Simple

微信小程序订阅消息开发指南_微信订阅 thing_xjbx的博客-程序员秘密

2019年10月12日微信开放了小程序订阅消息的功能。按官方的说法,目前的模板消息在实现小程序服务闭环上存在缺陷:1. 部分开发者在用户无预期或未进行服务的情况下发送与用户无关的消息,对用户产生了骚扰;2. 模板消息需在用户访问小程序后的 7 天内下发,不能满足部分业务的时间要求模板消息确实存在上述的硬伤,不利于小程序的用户留存和用户体验。为了解决这些问题,微信官方推出了用户订阅消息功能。我在微慕专业版上加了订阅消息的功能,并验证了这个功能。这个功能是否能都达到官方的预期,这个我感觉不那么乐观

第一篇博客:实验室搭建hadoop集群(centOS, ambari)_hadoop集群搭建实验报告_SuX97的博客-程序员秘密

centOS系统安装问题首先,两台机子分别是:一台已经安装Ubuntu18+win10, 将会作为主要控制节点:NameNode, 另一台为服务器DataNode,已经安装ubuntu。因为实验室一定要我装centOS,所以开始安装,发现如下问题:NameNode上安装centOS后没有无线网链接,网卡型号为Ralink MT7601U,按照网络教程安装后,用lsmod查看驱动服务已启动仍然...

android studio 3.5.2安装后,无法安装Hardware Accelerated Execution Manager (HAXM)_骁悦彬子的博客-程序员秘密

无法安装Hardware Accelerated Execution Manager (HAXM),提示:install HAXM invalid.手动安装也提示失败。配置环境win7 64 旗舰版jdk 64 1.8一、解决方法一经查看是因为win7 sp1 64需要安装补丁KB3033929"it is required to install Microsoft...

**在学习C++Eigen库的配置和应用中常见问题汇总(一)**_c++中.cpp调用eigen库报错_qq_41654121的博客-程序员秘密

**在学习C++Eigen库的配置和应用中常见问题汇总(一)**在学习信息处理的时候常常要接触到函数和矩阵运算,虽然matlab是个不错的选择,但是如果能在编程的时候导入一个库,库里面有默认的矩阵运算,那就简直不要太好呢,eigen库是最好用的一个,常常跟c++结合使用。关于eigen库的详细知识大家可以自己搜索,这篇博客只是在工程学习的角度讲一些干货。首先下载:可以登录eig...

SVN服务器如何搭建和使用_misstoyou的博客-程序员秘密

SVN服务器如何搭建和使用步骤1:安装SVN服务器 图片无法上传,请谅解方法/步骤1:百度搜索“VisualSVN Server”和“TortoiseSVN”,在其各自的官网上下载如下;方法/步骤2:选择一台电脑作为服务器,把“VisualSVN Server”程序拷贝过去,双击即可安装,如图;方法/步骤3:默认安装VisualSVN Server的服务器组件和管...

推荐文章

热门文章

相关标签