Após uma pergunta relacionada , gostaria de perguntar sobre os novos tipos de caracteres e literais de string no C ++ 11. Parece que agora temos quatro tipos de caracteres e cinco tipos de literais de string. Os tipos de personagem:
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 os literais de string:
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)
A questão é: as referências do caractere / \x
/ \u
podem \U
ser combinadas livremente com todos os tipos de string? Todos os tipos de string têm largura fixa, ou seja, os arrays contêm exatamente tantos elementos quanto aparecem no literal, ou as referências \x
/ \u
/ \U
são expandidas em um número variável de bytes? As strings u""
e u8""
têm semântica de codificação, por exemplo, posso dizer char16_t x[] = u"\U0010FFFF"
, e o codepoint não BMP é codificado em uma sequência UTF16 de duas unidades? E da mesma forma para u8
? Em (1), posso escrever substitutos solitários com \u
? Finalmente, alguma das funções de string reconhece a codificação (ou seja, elas reconhecem os caracteres e podem detectar sequências de bytes inválidas)?
Esta é uma questão um pouco aberta, mas gostaria de obter uma imagem o mais completa possível da nova codificação UTF e recursos de tipo do novo C ++ 11.
u"\U0010FFFF"
em um par substituto.