wchar_t
, char16_t
veya char32_t
değerini dar bir ostream ile beslerseniz, kod noktasının sayısal değerini yazdıracaktır.iostreams - "wchar_t" veya "charXX_t" değerini karakter olarak yazdırma
baskılar x120120120
. Bunun nedeni, basic_ostream
'un charT
ile belirli bir kombinasyonu için operator<<
olmasıdır, ancak diğer karakter türleri için benzer operatörler olmadığından, sessizce int
'a dönüştürülür ve bu şekilde yazdırılır. Benzer bir şekilde, sigara dar dize hazır (L"x"
, u"x"
, U"X"
) sessizce dize (wstring
, u16string
, u32string
) da derlenmez nesneleri void*
dönüştürülür ve işaretçi değeri olarak basılmış ve olmayan dar olacaktır.
Yani, soru: dar ostream üzerinde karakteri yerine kod noktasıyla sayısal değer olarak daha gibi bir wchar_t
, char16_t
veya char32_t
değerini yazdırmak için en az korkunç yolu nedir? Bu kodlamada, kodlamanın kodlamada gösterilebilen tüm kod noktalarını doğru bir şekilde dönüştürmesi gerekir ve kod noktası gösterilemediğinde bir hata bildirmelidir. (Örneğin, u'…'
verildi ve UTF-8 ostream, üç baytlık sekansı 0xE2 0x80 0xA6 akışına yazılmalıdır fakat u'â'
verildi ve KOI8-R ostream, bir hata rapor edilmelidir.) Aynı şekilde
Bir dar dar alan üzerinde dar bir C-string veya string nesnesi nasıl basılır, çıktı kodlamasına dönüştürülebilir?
Bu, ISO C++ 11 içinde yapılamazsa, platforma özel yanıtlar alırım.
(this question esinlenerek.)
, ya 1) geniş bir ostream kullanmak zorunda veya 2)) bir potansiyel kayıplı dönüşüm olan (kendini kodlayan dar geniş karakter verileri dönüştürmek. Bir ostream sizin için bu dönüşümü yapamaz. ['Std :: wstring_convert'] 'a bakın (http: //en.cppreference.com/w/cpp/locale/wstring_convert) veya [ICONV] (https://www.gnu.org/software/libiconv/) veya [ICU] gibi bir kütüphane kullanın (http: //site.icu-project. org /). –