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