2012-12-19 38 views
7

我需要能够在log4cxx中使用utf-8编码的字符串。我可以用std::cout打印字符串(字符显示正确)。使用log4cxx,即将字符串放入LOG4CXX_DEBUG()宏,并输入ConsoleAppender将输出“??”而不是特殊字符。我找到了一个解决方案:在log4cxx中使用utf-8字符

LOG4CXX_DECODE_CHAR(logstring, str); 
LOG4CXX_DEBUG(logstring); 

其中str是我的输入字符串,但这不起作用。任何人都有一个想法如何可能工作?我谷歌了一下,但我找不到任何有用的东西。

回答

3

您可以使用

setlocale(LC_CTYPE, "UTF-8"); 

只设定的字符编码,无需改变有关区域的任何其他信息。

1

一种解决方案是在我的主函数中使用

setlocale(LC_ALL, "en_US.UTF-8"); 

。这对我来说可以,但如果你想要更多本地化的应用程序,这可能很难追踪/使用。

1

第一个答案对我来说不起作用,第二个答案不是我想要的。所以,我结合两个答案:

setlocale(LC_CTYPE, "xx_XX.UTF-8"); // or "xx_XX.utf8", it means the same 

其中xx_XX是一些语言标记。我试图用不同的字母在多种语言中记录字符串(在LINUX上,包括中文,从左到右和从左到右的语言);所以我尝试过:

setlocale(LC_CTYPE, "it_IT.UTF-8"); 

它可以使用任何测试语言。我不明白为什么没有指出语言xx_XX的简单“UTF-8”不起作用,因为我使用UTF8是独立于语言的,而且不应该指明一个。 (如果有人知道这个原因,对答案会有一个有趣的改进)。也许这也取决于Operatin System。

最后,在Linux上,你可以通过输入上壳获得的编码列表:

# locale -a | grep utf 
1

我遇到了同样的问题,找啊找。我发现这篇文章,它可能会工作,但我不喜欢setlocaleish解决方案。所以我做了更多的研究,最终解决方案出来了。

我重新配置log4cxx并构建它,问题解决了!

增加两个配置选项中log4cxx

./configure --prefx=blabla --with-apr=blabla --with-apr-util=blabla --with-charset=utf-8 --with-logchar=utf-8 

希望这将帮助任何人谁需要它。