vs下,GBK格式的.h .cpp 编译时,自动转换为UTF-8
来源:互联网 发布:linux $$ 编辑:程序博客网 时间:2024/06/09 15:15
转自
http://suool.net/
这个问题,当然可以在建立文件保存的时候选择高级保存选择,然后选择保存的格式。
但是,显然,在项目文件很多的时候,这个不是一个聪明的选择。所以,就要想办法如何批量的转化处理。
在Linux下面有专门的命令可以实现这个功能。
在Windows下面要如何做呢?
当然,借助于我们万能的C++一样可以很方便的解决它,经过一番查找资料,现在共享一下我的解决方法,首先,要在VS里面建立一个VC的控制台程序项目。
然后新建一个convert源文件。代码如下:
⦁ // 定义控制台应用程序的入口点。
⦁ //
⦁
⦁ #include "stdafx.h"
⦁ #include <afxwin.h>
⦁ #include <string>
⦁ #include <iostream>
⦁
⦁ #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
⦁ {
⦁ /*for(int i = 0; i < argc; i++)
⦁ {
⦁ MessageBox(NULL, argv[i], L"Arglist contents", MB_OK);
⦁ }*/
⦁ //声明一个CFileFind类变量,以用来搜索
⦁
⦁ //接受一个参数作为源代码文件的根目录
⦁ TCHAR *lpszDirName = argv[1];
⦁ CString strFileType;
⦁ strFileType.Format(_T("%s\\*.*"), lpszDirName);
⦁ //递归此目录下的.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")) {
⦁ 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;
⦁ str[len] = '\n';
⦁ const unsigned char aryBOM[] = { 0xEF, 0xBB, 0xBF };
⦁ fp.Write(aryBOM, sizeof(aryBOM));
⦁ fp.Write(str, len);
⦁ delete[] str;
⦁ fp.Close();
⦁ }
如果编译出现错误请点击,项目--属性--一般------MFC的使用选择共享DLL的方式。
然后将编译成功的.exe文件放在项目的目录下,比如:
然后选择项目,属性的与生成事件,将要转换的源码目录放在.exe 的后面即可,这样虽然在您编写的时候保存的是GBK,但是在项目进行编译之前会把指定目录下的所有C++源码文件转换为UTF-8的格式,具体格式如下:
当然,您也可以直接在cmd中运行该exe文件,在后面加上要转换的目录即可。格式为: convert.exe Dir
这样在编译之前就会先将源码文件格式转换为UTF-8的格式。
0 0
- vs下,GBK格式的.h .cpp 编译时,自动转换为UTF-8
- 【笔记】如何把GBK的文本格式转换为UTF-8格式
- oracle编码格式从utf-8转换为GBK
- oracle编码格式从utf-8转换为GBK
- oracle编码格式从utf-8转换为GBK
- eclipse转android studio解决GBK编码转换为UTF-8格式的方法
- 如何使用Java代码将GBK编码格式的工程转换为UTF-8编码格式的工程
- iconv转换编码格式 gbk utf-8
- VC++ UTF-8与GBK格式转换
- 字符gbk转换为utf-8的sublime插件
- 网页爬虫抓取utf-8的html时转换为GBK字符串
- linux下gbk转换utf-8
- 怎样将utf-8格式的文件转换成gbk格式的文件
- Python:将utf-8格式的文件转换成gbk格式的文件
- 用IO流技术-将GBK格式的文本文件转存为UTF-8格式的文本文件
- 如何将集群文件转换格式-shell指令将GBK文件转成UTF-8的格式
- 将windows下的ansi格式文本转换为linux下能识别的UTF-8格式
- vs中cpp文件编码格式为utf8,注释有汉字,编译不通过的问题
- [从头学数学] 第184节 周游列国拜诸侯(中)
- C#引用传递
- HDU 5666 快速就乘
- 用pipe唤醒异步select的经典场景
- __NSCFNumber isEqualToString:的问题.--[__NSCFNumber isEqualToString:]: unrecognized selector sent to in
- vs下,GBK格式的.h .cpp 编译时,自动转换为UTF-8
- Java学习-11天
- 剑指offer面试题 顺时针打印矩阵
- 一个用PHP写的网站,当两个人同时用一个账号登录时,后一个会将前一个账号挤下线。
- leetcode 9 给一个int类型的数字,判断是否是回文数
- codeforces 425A Sereja and Swaps
- Spark 调试
- .NET 开源
- ASP.NET MVC4,Angular Js 开发之显示图片