这篇文章上次修改于 437 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

LOG4CPLUS输出中文日志(UTF8编码),同时适应Unicode与非Unicode。对std::string与string literal不同的处理。

说明

为了同时支持Unicode环境和非Unicode环境,非Unicode环境都可以直接使用。

  1. 流式输出时需要转换为指针或使用宏进行字符串类型转换;
  2. 格式输出时必须使用宏进行编码转换后再获取字符指针。

示例

//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下编译失败
}