2015-07-22 93 views
5

Tôi đang cố gắng để in chữ Hán sử dụng các loại wchar_t, char16_tchar32_t, nhưng không thành công (live example)Tôi đang cố gắng in một ký tự Trung Quốc bằng cách sử dụng các loại wchar_t, char16_t và char32_t, để không có kết quả.

#include <iostream> 
int main() 
{ 
    char x[] = "中";   // Chinese character with unicode point U+4E2D 
    char y[] = u8"中"; 
    wchar_t z = L'中'; 
    char16_t b = u'\u4e2d'; 
    char32_t a = U'\U00004e2d'; 

    std::cout << x << '\n';  // Ok 
    std::cout << y << '\n';  // Ok 
    std::wcout << z << '\n'; // ?? 
    std::cout << a << '\n';  // prints the decimal number (20013) corresponding to the unicode point U+4E2D 
    std::cout << b << '\n';  //    "     "     " 
} 
+0

std :: wcout không hoạt động nếu bạn đang cố gắng để viết văn bản mà không thể được đại diện trong miền địa phương mặc định của bạn. – WorldSEnder

+1

C++ không hỗ trợ Unicode có thể sử dụng được. Nếu bạn cần xử lý Unicode (không tầm thường), hãy sử dụng một thư viện chuyên dụng như [ICU] (http://site.icu-project.org/). (Có, bạn có thể nhận được một cái gì đó được thực hiện với 'std :: string' trên không Windows và' wstring' trên Windows, nhưng meh). –

+0

@BaummitAugen Dường như nó hoạt động với UTF-8 –

Trả lời

5

Vì bạn đang chạy thử nghiệm của bạn trên một hệ thống Linux, mã nguồn là UTF- 8, đó là lý do tại sao xy là điều tương tự. Các byte này được shunted, unmodified, thành đầu ra tiêu chuẩn bởi std::cout << xstd::cout << y và khi bạn xem trang web (hoặc khi bạn nhìn vào thiết bị đầu cuối linux), bạn sẽ thấy ký tự như bạn mong đợi.

std::wcout << z sẽ in nếu bạn làm hai việc:

std::ios::sync_with_stdio(false); 
std::wcout.imbue(std::locale("en_US.utf8")); 

mà không unsynching từ C, GNU libstdC++ đi qua C IO suối, mà không bao giờ có thể in một char rộng sau khi in một char hẹp trên cùng một luồng. LLVM libC++ xuất hiện để làm việc thậm chí được đồng bộ, nhưng tất nhiên vẫn cần imbue để nói cho luồng làm thế nào để chuyển đổi các ký tự rộng sang byte mà nó gửi vào đầu ra tiêu chuẩn.

Để in ba, bạn sẽ phải chuyển đổi chúng thành rộng hoặc hẹp; thậm chí với wbuffer_convert thiết lập luồng char32_t là rất nhiều công việc. Nó sẽ giống như thế này:

std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv32; 
std::cout << conv32.to_bytes(a) << '\n'; 

Đưa nó tất cả cùng nhau: http://coliru.stacked-crooked.com/a/a809c38e21cc1743

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