用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();
- 用CAtlFile类写日志文件时出现乱码
- 写文件开头出现乱码
- 用java代码写xml文件时,出现中文乱码的解决方法
- 写文件为什么出现中文乱码
- UNICODE程序写文件出现乱码
- 用WriteFile写文件时乱码
- DataOutputStream类中的writeUTF()写文件,文件头部总出现乱码
- 用dom将数据写到xml中 设置xml文件gbk编码时中文会出现乱码
- IIS部署日志站点时出现的UTF8文件乱码问题及解决
- 用Eclipse写网页出现乱码问题
- 关于CFile试用Write写文件时出现乱码的解决办法
- java io写文件 在linux出现中文乱码
- java io写文件 在linux出现中文乱码
- java io写文件 在linux出现中文乱码
- QTextStream写文件,文件打开时乱码
- SUSE Tomcat日志出现乱码
- 用notepad++编写html文件时,中文出现乱码解决办法
- asp 写文件乱码
- 一、图像采集原理
- UML类图关系大全
- poj3009 Curling 2.0
- T-SQL如何將YYYYMMDDHHmmssnnn轉換為datetime
- 有D攰攰碟
- 用CAtlFile类写日志文件时出现乱码
- 幽幽雨儿情,滴滴母爱深
- 基于unity3d(C#)的有限状态机设计
- 23设计模式形象比喻篇
- ios NSAssert调试程序
- include和require的区别
- 111111111111
- Linux下sort命令小结
- mj-评《冰雪奇缘》9分