Подтвердить что ты не робот

Строковые литералы Unicode

С++ 11 представляет новый набор префиксов строковых литералов (и даже позволяет определять суффиксы, заданные пользователем). Кроме того, вы можете напрямую использовать escape-последовательности Unicode для кодирования определенного символа, не беспокоясь о кодировании.

const char16_t* s16 = u"\u00DA";
const char32_t* s32 = U"\u00DA";

Но могу ли я использовать escape-последовательности unicode в строковых литералах wchar_t? Казалось бы, это был дефект, если это было невозможно.

const wchar_t* sw = L"\u00DA";

Целочисленное значение sw[0], конечно, будет зависеть от того, что wchar_t находится на определенной платформе, но для всех других эффектов это должно быть портативным, нет?

4b9b3361

Ответ 1

Это сработает, но у него может не быть желаемой семантики. \u00DA будет расширяться на столько целевых символов, сколько необходимо для кодировки UTF8/16/32, в зависимости от размера wchar_t, но имейте в виду, что в широких строках нет какой-либо задокументированной гарантированной семантики кодирования - они просто "системное кодирование", без попытки сказать, что это такое, или потребовать от пользователя знать, что это такое.

Так что лучше не смешивать и не сочетать. Используйте один, но не оба, из двух:

  • зависит от системы: char*/"", wchar_t*/L"", \x -литераторы, mbstowcs/wcstombs

  • Юникод: char*/u8"", char16_t*/u"", char32_t*/u"", \u/\u литералы.

(Ниже приведены некоторые questions по этому вопросу.)