Кодировка Unicode для строковых литералов в C ++ 11

В ответ на вопрос, связанный с , я хотел бы спросить о новых типах символьных и строковых литералов в C ++ 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 и средств ввода нового C ++ 11.

76
задан Community 23 May 2017 в 11:54
поделиться