2012-12-19 3 views
7

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

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

strは私の入力文字列であるが、これは動作しません。誰でもこれがどのように機能するか考えていますか?私は少し周りgoogle'd、しかし私は何か有用なものを見つけることができませんでした。

答えて

3

あなたはロケールに関するその他の情報を変更せず、唯一の文字エンコーディングを設定する

setlocale(LC_CTYPE, "UTF-8"); 

を使用することができます。

1

一つの解決策は、私の主な機能に

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

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

1

最初の回答は私のためには機能しませんでした。もう1つは私が望む以上です。だから私は2つの答えを組み合わせた:

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

ここで、xx_XXはいくつかの言語タグです。文字列をさまざまな言語でロケールしようとしました(中国語、左から右へ、左から右へ)。だから私は試しました:

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

そしてテスト済みの言語で動作しました。 UTF8を言語に依存せずに使用するので、なぜxx_XXという言語を示さない単純な「UTF-8」が機能しないのか理解できません。 (誰かがその理由も知っていれば、その答えに興味深い改善があります)。これはOperatin Systemによっても変わるかもしれません。

最後に、Linux上であなたはシェルに入力して、エンコーディングのリストを取得することができます。

# locale -a | grep utf 
1

私は同じ問題に会って検索し、検索。私はこのポストを見つけた、それは動作するかもしれませんが、私はsetlocaleishソリューションが嫌いです。だから私はより多くの研究をし、最終的に解決策が出ました。

log4cxxを再設定してビルドすると、問題は解決しました。

log4cxxに2つの以上のconfigureオプションを追加:

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

が、これは、それを必要とする人を助けることを願っています。

関連する問題