8

log4cxxでutf-8でエンコードされた文字列を使用できるようにする必要があります。文字列をうまく印刷できますstd::cout(文字は正しく表示されます)。log4cxxを使用します。つまり、文字列をLOG4CXX_DEBUG()マクロに挿入すると、 ConsoleAppender「??」が出力されます。特殊文字の代わりに。私は1つの解決策を見つけました:

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

私は同じ問題に遭遇し、検索して検索しました。私はこの投稿を見つけました、それはうまくいくかもしれませんが、私は解決策が好きではありませんsetlocaleish。それで私はもっと研究をしました、ついに解決策が出てきました。

再構成log4cxxしてビルドすると、問題は解決しました。

次の場所にさらに2つの構成オプションを追加しますlog4cxx

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

これがそれを必要とする人に役立つことを願っています。

于 2017-07-29T12:42:56.357 に答える
1

1つの解決策は使用することです

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

私の主な機能で。これは私にとっては問題ありませんが、よりローカライズ可能なアプリケーションが必要な場合は、追跡/使用が困難になる可能性があります。

于 2012-12-19T17:16:13.003 に答える
1

最初の答えは私にはうまくいきませんでした、2番目の答えは私が望む以上のものです。だから私は2つの答えを組み合わせました:

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を言語に依存しないために使用しているため、1つを示すべきではないからです。(誰かがその理由も知っているなら、答えに対する興味深い改善になるでしょう)。多分これはOperatinシステムにも依存します。

最後に、Linuxでは、シェルで次のように入力することで、エンコーディングのリストを取得できます。

# locale -a | grep utf
于 2014-02-27T16:08:19.803 に答える