用CAtlFile类写日志文件时出现乱码

来源:互联网 发布:帝国cms图片集模板 编辑:程序博客网 时间:2024/05/17 06:43

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();

0 0