Po pokrewnym pytaniu chciałbym zapytać o nowe typy literałów znakowych i łańcuchowych w C ++ 11. Wygląda na to, że mamy teraz cztery rodzaje znaków i pięć rodzajów literałów tekstowych. Typy postaci:
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
I literały ciągów:
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)
Pytanie brzmi: czy odwołania do znaków \x
/ \u
/ można \U
dowolnie łączyć ze wszystkimi typami łańcuchów? Czy wszystkie typy łańcuchów mają stałą szerokość, tj. Tablice zawierają dokładnie tyle elementów, ile występuje w literale, czy też odwołania do \x
/ \u
/ \U
są rozszerzane do zmiennej liczby bajtów? Czy u""
i u8""
łańcuchy znaków mają semantykę kodowania, np. Czy mogę powiedzieć char16_t x[] = u"\U0010FFFF"
, a punkt kodowy inny niż BMP zostaje zakodowany w dwuczęściowej sekwencji UTF16? I podobnie dla u8
? W (1), czy mogę pisać samotne surogaty z \u
? Wreszcie, czy którakolwiek z funkcji kodowania znaków jest świadoma (tj. Rozpoznają znaki i mogą wykrywać nieprawidłowe sekwencje bajtów)?
To jest trochę otwarte pytanie, ale chciałbym uzyskać możliwie pełny obraz nowego kodowania UTF i funkcji typu nowego C ++ 11.
u"\U0010FFFF"
w parę zastępczą.