zoukankan      html  css  js  c++  java
  • 如何将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();
    	}
    }



  • 相关阅读:
    解决Warning: Cannot modify header information headers already sent b...
    C#获取文件路径的几种方法
    C#反射技术之一读取和设置类的属性
    WPF中,在WebBrowser中操作源代码
    WPF 的 TabControl 绑定不同的窗口集合
    C#_在VS2010下进行单元测试
    Mvvm Light Toolkit for wpf/silverlight系列之Command和Events
    VS2005和VS2008快捷键大全(转)
    nchar,char,varchar 与nvarchar区别
    处理问题:windows server 2016由于没有远程桌面授权服务器可以提供许可证,远程会话被中断。请跟服务器管理员联系...
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3509062.html
Copyright © 2011-2022 走看看