2012-12-19 4 views
7

Potrzebuję móc używać łańcuchów utf-8 z log4cxx. Mogę wydrukować ciągi bez problemu z std::cout (znaki są wyświetlane poprawnie). Użycie log4cxx, tj. Umieszczenie łańcuchów w makrze LOG4CXX_DEBUG() za pomocą ConsoleAppender wyświetli "??" zamiast specjalnego znaku. Znalazłem jedno rozwiązanie:Używanie znaków utf-8 w log4cxx

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

gdzie str jest moim ciągiem wejściowym, ale to nie działa. Ktoś ma pomysł, jak to może działać? Trochę go interesowałem, ale nie mogłem znaleźć niczego przydatnego.

Odpowiedz

3

Można użyć

setlocale(LC_CTYPE, "UTF-8"); 

ustawić tylko kodowanie znaków, nie zmieniając żadnych innych informacji o lokalizacji.

1

Jednym z rozwiązań jest użycie

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

w moim głównych funkcji. Jest to dla mnie w porządku, ale jeśli chcesz mieć więcej możliwych do zlokalizowania aplikacji, będzie to prawdopodobnie trudne do śledzenia/używania.

1

Pierwsza odpowiedź nie działa dla mnie, druga to więcej niż chcę. Dlatego połączyłem dwie odpowiedzi:

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

gdzie xx_XX jest jakimś znacznikiem języka. Próbowałem logować ciągi w wielu językach z różnymi alfabetami (na LINUX, w tym w języku chińskim, w językach od lewej do prawej i od prawej do lewej); więc spróbowałem:

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

i działało z każdym testowanym językiem. Nie mogę zrozumieć, dlaczego prosty "UTF-8" bez wskazania języka xx_XX nie działa, ponieważ używam UTF8 jako niezależnego od języka i nie należy go określać. (Jeśli ktoś zna przyczynę także tego, byłoby ciekawym ulepszeniem odpowiedzi). Może to zależy również od systemu operacyjnego.

Wreszcie na Linuksie można uzyskać listę kodowań wpisując na muszli:

# locale -a | grep utf 
1

Poznałem ten sam problem i szukał i szukał. Znalazłem ten post, To może działać, ale nie podoba mi się rozwiązanie setlocaleish. więc zrobiłem więcej badań, wreszcie rozwiązanie wyszło.

Ponownie skonfigurowałem log4cxx i zbudowałem, problem został rozwiązany!

dodać jeszcze dwie opcje konfiguracyjne w log4cxx:

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

nadzieję, że pomoże każdemu, kto go potrzebują.