Строковые литералы Юникода - PullRequest
13 голосов
/ 03 октября 2011

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

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

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

const wchar_t* sw = L"\u00DA";

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

1 Ответ

10 голосов
/ 03 октября 2011

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

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

  1. для системы: char* / "", wchar_t* / L"", \x -литералы, mbstowcs / wcstombs

  2. Unicode: char* / u8"", char16_t* / u"", char32_t* / U"", \u / \U литералов.

(Вот некоторые связанных вопросов моих по этому вопросу.)

...