2015-07-22 16 views
5

Ben (live example)Çince bir karakteri wchar_t, char16_t ve char32_t türlerini kullanarak kopyalamaya çalışıyorum.

#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 çalışmaz. – WorldSEnder

+1

C++, kullanılabilir bir Unicode desteğine sahip değil. Eğer (önemsiz) Unicode işleme ihtiyacınız varsa, [ICU] gibi bir kütüphane kullanın (http://site.icu-project.org/). (Evet, Windows'ta std :: string' ile Windows üzerinde bir şey yapamazsınız, ancak Windows'da wstring'tir). –

+0

@BaummitAugen UTF-8 –

cevap

5

Bir Linux sistemi üzerinde testinizi yayınlandığı için kaynak kodu başarılı olamadı, türlerini wchar_t, char16_t ve char32_t kullanarak Çinli karakteri yazdırmak çalışıyorum UTF- 8, bu yüzden x ve y aynı şeydir. Bu baytlar, std::cout << x ve std::cout << y tarafından standart çıktıya dönüştürülmeden değiştirilir ve web sayfasını görüntülediğinizde (veya linux terminaline baktığınızda), karakteri beklediğiniz gibi görürsünüz. iki şey yaparsanız

std::wcout << z yazdırır: C unsynching olmadan

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

, GNU libstdC++ aynı akışta dar kömürü baskı sonrasında geniş kömürü baskı asla C IO akarsu, geçer. LLVM libC++ 'nın senkronize çalıştığı görülebilir, ancak elbette, akışa geniş karakterleri standart çıktıya gönderdiği byte'lara nasıl çevireceğine söyleme zorunluluğu hala var.

b ve a'u yazdırmak için bunları geniş veya dar olacak şekilde dönüştürmeniz gerekir; Bir char32_t akışı oluşturan wbuffer_convert ile bile çok fazla iş var. Bu şuna benzer:

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

Hepsini bir araya getirirsek: Varsayılan yerel ayarda temsil edilemez metin yazmak çalışıyorsanız http://coliru.stacked-crooked.com/a/a809c38e21cc1743