Следуя связанному вопросу, я хотел бы спросить о новых символьных и строковых литералах в С++ 11. Кажется, что теперь у нас есть четыре типа символов и пять видов строковых литералов. Типы символов:
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
И строковые литералы:
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)
Возникает вопрос: свободно ли сочетаются символы символа \x
/\u
/\u
со всеми типами строк? Все строковые типы фиксированной ширины, т.е. Массивы содержат точно столько же элементов, что и в литеральном, или для ссылок \x
/\u
/\u
, которые расширяются в число переменных байтов? Строки u""
и u8""
имеют семантику кодирования, например. могу ли я сказать char16_t x[] = u"\U0010FFFF"
, а кодовый номер без BMP закодирован в двухуровневую последовательность UTF16? И аналогично для u8
? В (1) можно написать одиночные суррогаты с помощью \u
? Наконец, известны ли какие-либо из кодировок строковых функций (т.е. Они распознаются символами и могут обнаруживать недействительные последовательности байтов)?
Это немного открытый вопрос, но я хотел бы получить как можно более полную картину новых возможностей кодирования и типа UTF нового С++ 11.