Nach einer verwandten Frage möchte ich nach den neuen Zeichen- und Zeichenfolgenliteraltypen in C ++ 11 fragen. Es scheint, dass wir jetzt vier Arten von Zeichen und fünf Arten von String-Literalen haben. Die Zeichentypen:
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
Und die String-Literale:
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)
Die Frage ist: Sind die \x
/ \u
/ \U
Zeichenreferenzen mit allen Zeichenfolgentypen frei kombinierbar? Haben alle Zeichenfolgentypen eine feste Breite, dh die Arrays enthalten genau so viele Elemente, wie im Literal erscheinen, oder werden \x
/ \u
/ \U
Verweise auf eine variable Anzahl von Bytes erweitert? Haben u""
und u8""
Strings eine Codierungssemantik, z. B. kann ich sagen char16_t x[] = u"\U0010FFFF"
, und der Nicht-BMP-Codepunkt wird in eine UTF16-Sequenz mit zwei Einheiten codiert? Und ähnlich für u8
? Kann ich in (1) einsame Ersatzzeichen mit schreiben \u
? Ist schließlich eine der codierenden Zeichenfolgenfunktionen bekannt (dh sie sind zeichenbewusst und können ungültige Bytesequenzen erkennen)?
Dies ist eine offene Frage, aber ich möchte ein möglichst vollständiges Bild der neuen UTF-Codierungs- und Typfunktionen des neuen C ++ 11 erhalten.
u"\U0010FFFF"
in ein Ersatzpaar.