Преобразование из wstring в u16string и обратно (стандартное соответствие) в C ++ 17 / C ++ 20 - PullRequest
7 голосов
/ 20 апреля 2020

Моя основная платформа - Windows, поэтому я использую внутренне UTF-16 (в основном, строки BMP). Я хотел бы использовать консольный вывод для этих строк.

К сожалению, нет std::u16cout или std::u8cout, поэтому мне нужно использовать std::wcout. Поэтому я должен преобразовать свои u16strings в wstrings - какой самый лучший (и самый простой) способ сделать это?

On Windows Я знаю, что wstring указывает на данные UTF16, поэтому я могу создать простой std :: u16string_view, который использует те же данные (без преобразования). Но в Linux wstring обычно UTF32 ... Есть ли способ сделать это без макросов и без таких вещей, как допущение sizeof (wchar_t) == 2 => utf16?

1 Ответ

1 голос
/ 20 апреля 2020

В стандарте C ++ 20 нет ничего, что конвертирует wchar_t в char32_t и обратно. В конце концов, wchar_t - это , который должен быть достаточно большим, чтобы содержать любую поддерживаемую кодовую точку.

И действительно, везде поддерживается Unicode выше U + FFFF, wchar_t 32-битный, кроме Windows (и Java, но это не имеет значения). Так что да, даже сегодня работа с Unicode в портативном режиме проблематична c, и sizeof(wchar_t)==2 или #ifdef _WIN32 оба звучат как законные обходные пути.

Сказав это, wcout все еще без проблем работает с wchar_t на всех платформах независимо от базовой кодировки.

Только если вы обрезаете строк или работаете с отдельными кодовыми точками и , вы хотите поддерживать кодовые точки за пределами базовая c плоскость, , затем , вам необходимо принять во внимание суррогатные пары (что довольно просто, 0xD800–0xDBFF = первая пара, 0xDC00–0xDFFF = вторая пара, не вставляйте между ними) .

...