2012-12-19 24 views
7

Tôi cần có khả năng sử dụng các chuỗi được mã hóa utf-8 với log4cxx. Tôi có thể in các chuỗi tốt với std::cout (các ký tự được hiển thị chính xác). Sử dụng log4cxx, tức là đặt các chuỗi vào macro LOG4CXX_DEBUG() với một số ConsoleAppender sẽ xuất "??" thay vì nhân vật đặc biệt. Tôi đã tìm thấy một giải pháp:Sử dụng các ký tự utf-8 trong log4cxx

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

nơi str là chuỗi đầu vào của tôi, nhưng điều này không hoạt động. Bất cứ ai cũng có một ý tưởng làm thế nào điều này có thể làm việc? Tôi google xung quanh một chút, nhưng tôi không thể tìm thấy bất cứ điều gì hữu ích.

Trả lời

3

Bạn có thể sử dụng

setlocale(LC_CTYPE, "UTF-8"); 

để thiết lập chỉ mã hóa ký tự, mà không thay đổi bất kỳ thông tin nào khác về ngôn ngữ.

1

Một giải pháp là sử dụng

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

chức năng chính của tôi. Điều này là tốt cho tôi, nhưng nếu bạn muốn có nhiều ứng dụng có thể bản địa hóa, điều này có thể sẽ trở nên khó khăn để theo dõi/sử dụng.

1

Câu trả lời đầu tiên không hiệu quả đối với tôi, câu trả lời thứ hai nhiều hơn tôi muốn. Vì vậy, tôi kết hợp hai câu trả lời:

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

trong đó xx_XX là một số thẻ ngôn ngữ. Tôi đã cố gắng đăng nhập các chuỗi bằng nhiều ngôn ngữ với các bảng chữ cái khác nhau (trên LINUX, bao gồm tiếng Trung Quốc, ngôn ngữ từ trái sang phải và nghiêm ngặt-sang-trái); vì vậy tôi đã thử:

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

và nó hoạt động với bất kỳ ngôn ngữ được kiểm tra nào. Tôi không thể hiểu tại sao "UTF-8" đơn giản mà không chỉ ra ngôn ngữ xx_XX không hoạt động, vì tôi sử dụng UTF8 để độc lập về ngôn ngữ và không nên chỉ định ngôn ngữ. (Nếu ai đó cũng biết lý do cho điều đó, sẽ là một cải tiến thú vị cho câu trả lời). Có lẽ điều này cũng phụ thuộc vào hệ thống Operatin.

Cuối cùng, trên Linux, bạn có thể có được một danh sách các mã hóa bằng cách gõ vào vỏ:

# locale -a | grep utf 
1

tôi gặp vấn đề tương tự và đã tìm kiếm và đã tìm kiếm. Tôi tìm thấy bài đăng này, nó có thể hoạt động, nhưng tôi không thích giải pháp setlocaleish. vì vậy tôi đã nghiên cứu thêm, cuối cùng giải pháp đã xuất hiện.

Tôi định cấu hình lại log4cxx và xây dựng nó, sự cố đã được giải quyết!

thêm hai tùy chọn cấu hình trong log4cxx:

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

hy vọng điều này sẽ giúp bất cứ ai cần đến nó.

Các vấn đề liên quan