ANSI文档转成Unicode格式文档(超大文件也适用)

以前看过很多输入字串进行转换的例子,不是很方便。下面给出一个函数,只需输入源文件路径(ANSI文件的路径)和转换后保存路径(Unicode文件的路径)就可以了;还有一点,下面这个函数支持超大文件的转换。

//将ANSI编码文档转换为Unicode编码文档
void FileANSIToUncode(const CString &str1/*ANSI源文件路径*/, const CString &str2/*转换后Unicode文件保存路径*/)
{
//注释部分为小文件处理方式
/* try
{
CFile rfile, wfile;
if(!rfile.Open(str1, CFile::modeRead))
return;
if(!wfile.Open(str2, CFile::modeWrite | CFile::modeCreate))
return;
//写Unicode文件头
int a = 0xFF;
int b = 0xFE;
BYTE pbuf[2];
pbuf[0] = a;
pbuf[1] = b;
wfile.Write(pbuf, 2);
int iFileLen = rfile.GetLength();
PSTR buffer = new char[iFileLen];
rfile.Read(buffer, iFileLen);
rfile.Close();
wchar_t *pWideChar = new wchar_t[2*iFileLen];
//转换成Unicode的串
::MultiByteToWideChar(CP_ACP,
0,
buffer,
iFileLen,
pWideChar,
iFileLen);
int number = 0;
for (int i = 0; i < iFileLen; i++)
{
if(pWideChar[i] > 127)
number++;
}
//写Unicode文档
wfile.Write(pWideChar, 2*iFileLen - number);
wfile.Close();
delete []buffer;
delete []pWideChar;
}
catch (CFileException* e)
{
TCHAR szCause[255];
e->GetErrorMessage(szCause, 255);
AfxMessageBox(szCause);
e->ReportError();
e->Delete();
}
*/
//以下是对大文件的处理方式
#define BUF_SIZE (1024*1024)//每次处理的数据大小
try
{
CFile rfile, wfile;
if(!rfile.Open(str1, CFile::modeRead))
return;
if(!wfile.Open(str2, CFile::modeWrite | CFile::modeCreate))
return;
//定位开始位置
wfile.SeekToBegin();
//写Unicode文件头
int a = 0xFF;
int b = 0xFE;
BYTE pbuf[2];
pbuf[0] = a;
pbuf[1] = b;
wfile.Write(pbuf, 2);
int iFileLen = rfile.GetLength();


int num = (iFileLen % BUF_SIZE) ? (iFileLen / BUF_SIZE + 1) : (iFileLen / BUF_SIZE);
PSTR buffer = NULL;
wchar_t *pWideChar = NULL;
for (int i = 0; i < num; i++)
{
int nLen = BUF_SIZE;
if(i == num - 1)
nLen = iFileLen % BUF_SIZE;

buffer = new char[nLen];
rfile.Read(buffer, nLen);
pWideChar = new wchar_t[2*nLen];
//转换成Unicode的串
::MultiByteToWideChar(CP_ACP,0,buffer,nLen,pWideChar,nLen);
int number = 0;
for (int i = 0; i < nLen; i++)
{
if(pWideChar[i] > 127)
number++;
}
//写Unicode文档
wfile.Write(pWideChar, 2*nLen - number);
}
rfile.Close();
wfile.Close();
delete []buffer;
delete []pWideChar;
}
catch (CFileException* e)
{
TCHAR szCause[255];
e->GetErrorMessage(szCause, 255);
AfxMessageBox(szCause);
e->ReportError();
e->Delete();
}
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值