C++:在windows下使用log4cplus时如何以UTF-8编码输出中文?

8 篇文章 0 订阅

       如果Visual C++中字符集设置的是Unicode,如果想使用GBK格式让log4cplus输出中文,可以在log4cplus.properties配置文件中设置Local属性,例如:

log4cplus.appender.ALL_MSGS.Appender.Locale=Chinese_China.936

这样中文就会以GBK编码保存到文件中,但如果想以UTF-8编码保存中文到文件,Chinese_China.65001是没法使用的。原因在于Microsoft没有实现Chinese_China.65001这种std::Locale。如果想使用log4cplus保存以UTF-8编码的中文应该怎么办呢?很幸运,log4cplus提供了可以定义新的locale_name及其对应的字符编码转化器的方式。

     log4cplus提供了log4cplus::spi::LocaleFactory抽象类,我们需要继承它,并给出自己的实现:

class ChineseUtf8LocaleFactory : public log4cplus::spi::LocaleFactory {
private:
  static log4cplus::tstring const  CHS_UTF8;
public:
  std::locale createObject(const log4cplus::helpers::Properties & props) {
    return std::locale(std::locale("Chinese_China"), new std::codecvt_utf8<wchar_t>());
  };

  log4cplus::tstring const & getTypeName() const {
    return CHS_UTF8;
  };
};

log4cplus::tstring const ChineseUtf8LocaleFactory::CHS_UTF8 = LOG4CPLUS_TEXT("Chinese_China.65001");

然后在配置文件中,将Locale属性改成:

log4cplus.appender.ALL_MSGS.Appender.Locale=Chinese_China.65001

 最后,应用程序初始化代码中需要加入对ChineseUtf8LocaleFactory的调用:

log4cplus::Initializer initializer;

log4cplus::spi::LocaleFactoryRegistry& localeFactoryRegistry = log4cplus::spi::getLocaleFactoryRegistry();
localeFactoryRegistry.put(std::unique_ptr<ChineseUtf8LocaleFactory>(new ChineseUtf8LocaleFactory()));

PropertyConfigurator pc(LOG4CPLUS_TEXT("log4cplus.properties"));
pc.configure();

以上是以UTF-8编码保存的方式,但log4cplus对控制台输出没有提供Locale属性,如果控制台编码方式是UTF-8(可以通过命令chcp查看控制台当前编码),那怎样将UTF-8编码的中文打印到控制台呢?只需要在程序初始化时给std::wcout指定locale就行了。

std::wcout.imbue(std::locale(std::locale("Chinese"), new std::codecvt_utf8<wchar_t>()));

 

参考文档

log4cplus

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值