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
std :: wcout çalışmaz. – WorldSEnder
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). –
@BaummitAugen UTF-8 –