İlgili bir soruyu takiben , C ++ 11'deki yeni karakter ve dize değişmez türleri hakkında soru sormak istiyorum. Görünüşe göre şimdi dört çeşit karakterimiz ve beş çeşit dizgi değişmezimiz var. Karakter türleri:
char a = '\x30'; // character, no semantics
wchar_t b = L'\xFFEF'; // wide character, no semantics
char16_t c = u'\u00F6'; // 16-bit, assumed UTF16?
char32_t d = U'\U0010FFFF'; // 32-bit, assumed UCS-4
Ve dize değişmezleri:
char A[] = "Hello\x0A"; // byte string, "narrow encoding"
wchar_t B[] = L"Hell\xF6\x0A"; // wide string, impl-def'd encoding
char16_t C[] = u"Hell\u00F6"; // (1)
char32_t D[] = U"Hell\U000000F6\U0010FFFF"; // (2)
auto E[] = u8"\u00F6\U0010FFFF"; // (3)
Soru şudur: \x
/ \u
/ \U
karakter başvuruları tüm dizgi türleriyle serbestçe birleştirilebilir mi? Tüm dizgi türleri sabit genişlikte mi, yani diziler tam olarak değişmez değerde göründüğü kadar çok öğe içeriyor mu, yoksa \x
/ \u
/ \U
başvuruları değişken sayıda bayta genişletiliyor mu? u""
Ve u8""
dizelerin kodlama semantiği var mı , örneğin diyebilirim char16_t x[] = u"\U0010FFFF"
ve BMP olmayan kod noktası iki üniteli bir UTF16 dizisine kodlanır mı? Ve benzer şekilde için u8
? (1) 'e yalnız vekiller yazabilir miyim \u
? Son olarak, kodlama işlevlerinden herhangi biri farkında mı (yani, karakter farkındalar ve geçersiz bayt dizilerini saptayabilirler)?
Bu biraz açık uçlu bir soru, ancak yeni C ++ 11'in yeni UTF kodlama ve tür olanaklarının olabildiğince eksiksiz bir resmini elde etmek istiyorum.
u"\U0010FFFF"
bir vekil çift olarak kodlar .