Після відповідного запитання я хотів би запитати про нові типи символів і рядкових літералів у 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.
u"\U0010FFFF"
у сурогатну пару.