8

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

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

我的输入字符串在哪里str,但这不起作用。任何人都知道这可能如何工作?我用谷歌搜索了一下,但我找不到任何有用的东西。

4

4 回答 4

4

您可以使用

setlocale(LC_CTYPE, "UTF-8");

仅设置字符编码,而不更改有关区域设置的任何其他信息。

于 2012-12-19T17:20:53.417 回答
2

I met the same problem and searched and searched. I found this post, It may work, but I don't like the setlocaleish solution. so i made more research, finally the solution came out.

I reconfigure log4cxx and build it, the problem was solved!

add two more configure options in log4cxx:

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

hope this will help anyone who need it.

于 2017-07-29T12:42:56.357 回答
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 是独立于语言的,一个不应该指示一个。(如果有人也知道原因,那将是对答案的一个有趣的改进)。也许这也取决于操作系统。

最后,在 Linux 上,您可以通过在 shell 上键入来获取编码列表:

# locale -a | grep utf
于 2014-02-27T16:08:19.803 回答
1

一种解决方案是使用

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

在我的主要功能中。这对我来说没问题,但是如果您想要更多可本地化的应用程序,这可能会变得难以跟踪/使用。

于 2012-12-19T17:16:13.003 回答