这篇文章上次修改于 437 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
LOG4CPLUS输出中文日志(UTF8编码),同时适应Unicode与非Unicode。对std::string与string literal不同的处理。
说明
为了同时支持Unicode环境和非Unicode环境,非Unicode环境都可以直接使用。
- 流式输出时需要转换为指针或使用宏进行字符串类型转换;
- 格式输出时必须使用宏进行编码转换后再获取字符指针。
示例
//void log()
{
// LOG4CPLUS输出中文日志(UTF8编码),同时适应Unicode与非Unicode
// utf8字符串字面量使用LOG4CPLUS_C_STR_TO_TSTRING进行编码转换
// utf8字符串变量需要使用LOG4CPLUS_STRING_TO_TSTRING宏进行编码转换
std::string u8s = u8"世界";
// 1. 流式输出,转换成字符指针或使用宏
// 不能直接使用,否则Unicode编译失败
LOG4CPLUS_DEBUG(logger, "hello " << u8s.c_str());
LOG4CPLUS_DEBUG(logger, u8"你好 " << u8s.c_str());
LOG4CPLUS_DEBUG(logger, LOG4CPLUS_C_STR_TO_TSTRING(u8"你好 ") << u8s.c_str());
LOG4CPLUS_DEBUG(logger, u8"你好 " << LOG4CPLUS_STRING_TO_TSTRING(u8s));
//LOG4CPLUS_DEBUG(logger, u8"你好 " << u8s); //Unicode下编译失败
// 2. 格式化输出,格式及变化参数需要使用字符指针
// Unicode下,格式不含中文在可使用LOG4CPLUS_TEXT直接定义为相应指针
// 包含中文则需要使用LOG4CPLUS_C_STR_TO_TSTRING转换后再获取指针
// 可变参数一律需要转为字符指针
LOG4CPLUS_DEBUG_FMT(logger,
LOG4CPLUS_TEXT("hello %s"), //这里%s测试正常,但LOG4CPLUS文档建议使用%ls
LOG4CPLUS_STRING_TO_TSTRING(u8s).c_str());
LOG4CPLUS_DEBUG_FMT(logger,
LOG4CPLUS_C_STR_TO_TSTRING(u8"你好 %s").c_str(),
LOG4CPLUS_STRING_TO_TSTRING(u8s).c_str());
//LOG4CPLUS_DEBUG_FMT(logger, u8"你好 %s", u8s.c_str()); //Unicod下编译失败
}
没有评论
博主关闭了评论...