以前看过很多输入字串进行转换的例子,不是很方便。下面给出一个函数,只需输入源文件路径(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();
}
}