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


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

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

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

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

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

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


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

            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
    "), 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();
    	}
    }



  • 相关阅读:
    Hibernate——openSession和getCurrentSession区别
    Oracle存储过程分页 详解
    如何破解mysql数据库的密码
    Oracle约束详解
    Oracle分页查询
    Oracle如何管理权限和角色
    悲观锁和乐观锁详解
    Oracle控制结构详解
    Rose建模之各模型分析
    div布局中将页面居中的方法
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3509062.html
Copyright © 2020-2023  润新知