2012-12-19 12 views
7

Devo essere in grado di utilizzare stringhe con codifica utf-8 con log4cxx. Posso stampare bene le stringhe con std::cout (i caratteri sono visualizzati correttamente). Usando log4cxx, cioè mettendo le stringhe nella macro LOG4CXX_DEBUG() con un ConsoleAppender, verrà visualizzato "??" invece del carattere speciale. Ho trovato una soluzione:Utilizzo di caratteri utf-8 in log4cxx

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

dove str è la mia stringa di input, ma questo non funziona. Qualcuno ha un'idea di come potrebbe funzionare? Ho fatto un po 'di google, ma non ho trovato nulla di utile.

risposta

3

È possibile utilizzare

setlocale(LC_CTYPE, "UTF-8"); 

per impostare solo la codifica dei caratteri, senza cambiare tutte le altre informazioni il locale.

1

Una soluzione è quella di utilizzare

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

nella mia funzione principale. Questo è OK per me, ma se vuoi più applicazioni localizzabili, questo probabilmente diventerà difficile da tracciare/utilizzare.

1

La prima risposta non ha funzionato per me, la seconda è più di quanto voglio. Quindi ho combinato le due risposte:

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

dove xx_XX è un tag di lingua. Ho provato a registrare stringhe in molte lingue con alfabeti diversi (su LINUX, incluso il cinese, la lingua da sinistra a destra e da destra a sinistra); così ho provato:

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

e ha funzionato con qualsiasi lingua testata. Non riesco a capire perché il semplice "UTF-8" senza indicare una lingua xx_XX non funzioni, dato che io uso UTF8 per essere indipendente dalla lingua e uno non dovrebbe indicarne uno. (Se qualcuno ne conosce la ragione, sarebbe un miglioramento interessante della risposta). Forse questo dipende anche dal sistema operativo.

Infine, su Linux è possibile ottenere un elenco delle codifiche digitando sul guscio:

# locale -a | grep utf 
1

Ho incontrato lo stesso problema e cercato e cercato. Ho trovato questo post, potrebbe funzionare, ma non mi piace la soluzione setlocaleish. così ho fatto più ricerche, finalmente la soluzione è uscita.

Mi riconfigura log4cxx e lo compilo, il problema è stato risolto!

aggiungere altre due opzioni di configurazione in log4cxx:

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

speranza che questo vi aiuterà tutti coloro che ne hanno bisogno.

Problemi correlati