Строковые литералы 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
находится на определенной платформе, но для всех других эффектов это должно быть портативным, нет?
Ответы
Ответ 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 по этому вопросу.)