如何将Unicode文本写到日志文件中

2023-02-15,,,,

有时为了定位问题,我们需要结合打印日志来处理。特别是较难复现的,一般都需要查看上下文日志才能找出可能存在的问题。考虑到程序要在不同语言的操作系统上运行,程序界面显示要支持Unicode,打印出来的日志也要支持Unicode,即将运行日志以Unicode文本写到日志文件中。

那么如何才能将Unicode文本写到日志文件中呢?只要我们调用Unicode版本的写入函数,传入Unicode字符串就能实现写入了吗?试一试便知道,仅仅这样肯定实现不了的。经实际调试和使用,只要满足下面几点即可:

1、文件以二进制方式打开;

2、写入Unicode文本标识头:0xFFFE;

3、调用Unicode版本的写入函数,传入Unicode字符串;

4、如果打印日志中要换行,仅仅\n是不行的,要用\r\n。

下面分别给出两个版本的参考源码:

1、C函数写日志示例代码:

void WriteLog( LPCTSTR pszLog, LPCTSTR pszFilePath )
{
if ( pszLog == NULL || pszFilePath == NULL )
{
return;
} BOOL bFileExsit = PathFileExists( pszFilePath ); LPCTSTR pszMode = NULL;
#ifdef _UNICODE
pszMode = _T("ab+"); // 对于Unicode,要向文件中写入Unicode文字,必须以二进制方式打开
#else
pszMode = _T("a+");
#endif FILE* pFile;
pFile = _tfopen( pszFilePath , pszMode );
if( NULL == pFile )
{
return;
} if ( !bFileExsit )
{
// 新创建的日志文件,则写入Unicode头
BYTE chUnicodeHead[2] = { 0xff, 0xfe }; // Unicode头
fwrite( chUnicodeHead, sizeof(BYTE), sizeof(chUnicodeHead), pFile );
} SYSTEMTIME time;
::GetLocalTime( &time );
_ftprintf( pFile, _T("%04d-%02d-%02d %02d:%02d:%02d %s\r\n"), time.wYear, time.wMonth, time.wDay, time.wHour, time.wMinute, time.wSecond, pszLog );
fclose( pFile ); return;
}

2、MFC中的CStdioFile示例:

void WriteLog( LPCTSTR pszLog, LPCTSTR pszFilePath )
{
if ( pszLog == NULL || pszFilePath == NULL )
{
return;
} CStdioFile logFile;
CFileException ex; BOOL bFileExsit = PathFileExists( pszFilePath );
UINT uOpenFlag = CFile::shareDenyNone | CFile::modeCreate | CFile::modeWrite | CFile::modeNoTruncate;
#ifdef _UNICODE
uOpenFlag |= CFile::typeBinary; // 对于Unicode版本,要写入Unicode文字,所以要设置CFile::typeBinary标记
#endif BOOL32 bRet = logFile.Open( pszFilePath, uOpenFlag, &ex );
if ( bRet )
{
#ifdef _UNICODE
// 对于新建的文件,为了向文件中写入Unicode文字,要写写入Unicode头
if ( !bFileExsit )
{
flog.SeekToEnd();
WORD unicodeFlag = 0xFEFF; // 文件采用unicode格式
flog.Write( (void*)&unicodeFlag, sizeof(WORD) );
}
#endif flog.SeekToEnd(); flog.WriteString( achPrintBuf );
flog.Close();
}
}

如何将Unicode文本写到日志文件中的相关教程结束。

《如何将Unicode文本写到日志文件中.doc》

下载本文的Word格式文档,以方便收藏与打印。