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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值