如何将Unicode文本写到日志文件中
有时为了定位问题,我们需要结合打印日志来处理。特别是较难复现的,一般都需要查看上下文日志才能找出可能存在的问题。考虑到程序要在不同语言的操作系统上运行,程序界面显示要支持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文本写到日志文件中的更多相关文章
- 【转】如何把Json格式字符写进text文件中
http://www.cnblogs.com/insus/p/4306640.html http://json2csharp.chahuo.com/ 本篇一步一步学习怎样把显示于网页的json格式的字 ...
- 如何把Json格式字符写进text文件中
本篇一步一步学习怎样把显示于网页的json格式的字符串写进text文件中,并保存起来.学习到创建model, Entity, 序列化List<object>转换为json,显示于网页上.然 ...
- Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件
Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ...
- Shell 从日志文件中选择时间段内的日志输出到另一个文件
Shell 从日志文件中选择时间段内的日志输出到另一个文件 情况是这样的,某系统的日志全部写在一个日志文件内,所以这个文件非常大,非常长,每次查阅的时候非常的不方便.所以,相关人员希望能够查询某个时间 ...
- Tomcat在windows服务器下,将tomcat控制台日志记录到日志文件中
Tomcat在windows服务器下,将tomcat控制台日志记录到日志文件中 在Linux系统中,Tomcat 启动后默认将很多信息都写入到 catalina.out 文件中,我们可以通过tail ...
- 将JSON对象带有格式的写出到文件中
需求:将一个JSON对象写出到文件中,要求文件中的JSON数据带有简单的格式.代码的实现参考了Java算法中的栈处理括号匹配问题.好了,不多说了,下面是代码的实现. 代码: package gemu. ...
- delegate 集成在类中,还是单独写在.h文件中?
转:http://stackoverflow.com/questions/11382057/declaring-a-delegate-protocol There definitely are sub ...
- 使用python脚本实现统计日志文件中的ip访问次数
使用python脚本实现统计日志文件中的ip访问次数,注意此脚本只适用ip在每行开头的日志文件,需要的朋友可以参考下 适用的日志格式: 106.45.185.214 - - [06/Aug/2014: ...
- jstack Dump 日志文件中的线程状态
[转]jstack Dump 日志文件中的线程状态 dump 文件里,值得关注的线程状态有: 死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condi ...
随机推荐
- Java知识回顾 (6)正则表达式、方法、文件与异常
一.正则表达式 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别. Java 正则表达式和 Perl 的是最为相似 ...
- SharePoint 特殊用户标识
To get claim for All Authenticated Users in PS you need to use:$claim = New-SPClaimsPrincipal -Encod ...
- windows域控里,属性和字段映射表
string[] prop = new string[] { "DisplayName", "SamAccountName", "UserPrinci ...
- iframe实现Ajax文件上传效果示例
<!doctype html> <html> <head> <meta charset=utf-8> <head> <title> ...
- .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)
本文内容 异步编程类型 异步编程模型(APM) 参考资料 首先澄清,异步编程模式(Asynchronous Programming Patterns)与异步编程模型(Asynchronous Prog ...
- SqlDateTime overflow / SqlDateTime 溢出
Error - SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM SqlDat ...
- 自己动手编译Linux内核
2008年04月27日 整理了一下Linux内核编译的方法,原始内核版本为Linux-2.4.20.8,新内核版本为Linux-2.4.22,其它内核版本编译方法类似. 一 准备工 ...
- JAVA常用代码
一. 判断是否包含某个注解. 1). 声明接口 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented ...
- 【Visual Studio】Visual Studio对CLR异常的特殊支持
Visual Studio 对异常进行了特殊的支持,它能够在进行了特殊设置后,使代码中的try catch块失效.也就是说,一个异常在正常情况下应该能够被某个特殊的try catch块捕获,但是Vis ...
- PyCharm for Mac(Python 开发工具)破解版安装
1.软件简介 PyCharm 是 macOS 系统上一款 Python 编辑利器,具有智能代码编辑器,能理解 Python 的特性并提供卓越的生产力推进工具:自动代码格式化.代码完成.重构.自动 ...