Suite à un Question connexe J'aimerais poser une question sur les nouveaux types de caractères et de chaînes de caractères en C++11. Il semble que nous ayons maintenant quatre types de caractères et cinq types de chaînes de caractères. Les types de caractères :
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
Et les chaînes littérales :
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 question est la suivante : Est-ce que les \x
/ \u
/ \U
Les références de caractères sont-elles librement combinables avec tous les types de chaînes de caractères ? Tous les types de chaînes de caractères ont-ils une largeur fixe, c'est-à-dire que les tableaux contiennent précisément autant d'éléments que ceux qui apparaissent dans le littéral, ou bien les types de chaînes de caractères ont-ils une largeur fixe ? \x
/ \u
/ \U
sont expansées en un nombre variable d'octets ? Est-ce que u""
et u8""
Les chaînes de caractères ont une sémantique d'encodage, par exemple, puis-je dire char16_t x[] = u"\U0010FFFF"
et le point de code non-BMP est encodé dans une séquence UTF16 de deux unités ? Et de la même manière pour u8
? Dans (1), puis-je écrire des substituts solitaires avec \u
? Enfin, les fonctions de chaîne de caractères sont-elles conscientes de l'encodage (c'est-à-dire qu'elles tiennent compte des caractères et peuvent détecter les séquences d'octets invalides) ?
Il s'agit d'une question un peu ouverte, mais j'aimerais obtenir une image aussi complète que possible du nouveau codage UTF et des fonctions de type du nouveau C++11.