CAtlFile是ATL库中用来操作文件的一个类,按照MSDN的说法,它只是对Windows文件处理API函数的一个简单包装。
比如CAtlFile::Write函数其实是对Win32 API ::WriteFile()的封装, Create函数是对::CreateFile()API函数的封装等等。
问题是:使用Write的时候,我直接将宽字符串写进了文件,文件显示有很多乱码。
解决办法:
第一种:将宽字符串转换成UTF-8
BOOL WriteOwnFile(TCHAR* pFileName, TCHAR* pBuffer)
{
HANDLE hFile = CreateFile(pFileName,
GENERIC_WRITE,
FILE_SHARE_WRITE,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (INVALID_HANDLE_VALUE != hFile)
{
DWORD dwSize = 0;
DWORD dwLen = WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, NULL, NULL, NULL, FALSE );
char* pchBuffer = new char[dwLen];
WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, pchBuffer, dwLen, NULL, FALSE );
WriteFile(hFile, pchBuffer, dwLen+1, &dwSize, NULL );
delete[] pchBuffer;
CloseHandle(hFile);
return TRUE;
}
return FALSE;
}
第二种:在文件的开头写两个字节 0xFF,0xFE,代表Unicode,然后就可以直接将宽字符串写进文件,而不会出现乱码了。CAtlFile file;
//如果文件不存在,则创建,否则打开
if (FAILED(file.Create(m_logFile, GENERIC_WRITE, FILE_SHARE_WRITE, OPEN_ALWAYS)))
return;
//因为是直接写的宽字符,所以要在文件的开头处写两个字节0xFF,0xFE,表示是unicode编码,这样就就不会出现乱码了
unsigned char pUnicodeMark[2] = { 0xFF, 0xFE };
file.Write(pUnicodeMark, 2);
//将文件指针偏移至文件末尾
if(FAILED(file.Seek(0,FILE_END)))
{
file.Close();
return;
}
//将宽字符日志信息追加写入文件
file.Write(strLog, strLog.GetLength() * sizeof(TCHAR));
file.Close();