A seguito di una domanda correlata , vorrei chiedere informazioni sui nuovi tipi di caratteri e stringhe in C ++ 11. Sembra che ora abbiamo quattro tipi di caratteri e cinque tipi di stringhe letterali. I tipi di carattere:
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
E le stringhe letterali:
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)
La domanda è questa: i riferimenti ai caratteri \x
/ \u
/ sono \U
liberamente combinabili con tutti i tipi di stringa? Tutti i tipi di stringa sono a larghezza fissa, cioè gli array contengono esattamente tanti elementi quanti appaiono nel letterale, oppure i riferimenti a \x
/ \u
/ \U
vengono espansi in un numero variabile di byte? Le stringhe u""
e u8""
hanno una semantica di codifica, ad esempio posso dire char16_t x[] = u"\U0010FFFF"
, e il punto di codice non BMP viene codificato in una sequenza UTF16 a due unità? E allo stesso modo per u8
? In (1), posso scrivere surrogati solitari con \u
? Infine, qualcuna delle funzioni stringa è a conoscenza della codifica (cioè sono in grado di riconoscere i caratteri e possono rilevare sequenze di byte non valide)?
Questa è una domanda un po 'aperta, ma mi piacerebbe ottenere un quadro il più completo possibile della nuova codifica UTF e delle funzionalità di tipo del nuovo C ++ 11.
u"\U0010FFFF"
in una coppia surrogata.