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

Стандартный способ в C11 и С++ 11 конвертировать UTF-8?

C11 и С++ 11 вводят заголовок uchar.h/cuchar, определяющий char16_t и char32_t как явно 16 и 32-разрядные символы ширины, добавленный литеральный синтаксис u"" и u"" для записи строк с этими типами символов вместе с макросами __STDC_UTF_16__ и __STDC_UTF_32__, которые сообщают вам, соответствуют ли они кодовым единицам UTF-16 и UTF-32. Это помогает устранить двусмысленность в отношении wchar_t, которая на некоторых платформах была 16-разрядной и обычно используется для хранения кодовых блоков UTF-16, а на некоторых платформах - 32 бит и обычно используется для хранения кодовых блоков UTF-32; предполагая, что эти макросы теперь установлены, теперь вы можете написать переносимый, недвусмысленный код, относящийся к UTF-16 и UTF-32. __STDC_ISO_10646__ также может использоваться как прокси-сервер, чтобы определить, способен ли wchar_t поддерживать значения UTF-32; если он не может, вы не можете предположить, что он содержит UTF-16, но, вероятно, достаточно близкое приближение к переносимости.

Они также добавляют функции mbrtoc16, mbrtoc32, c16rtomb и c32rtomb для преобразования между многобайтными символами и этими типами. Между ними и существующим семейством функций mbstowcs можно перевести между UTF-16, UTF-32, многобилетным набором символов платформы и широким набором символов на платформе (хотя и не обязательно без потерь, если только платформа не определена многобайтная и широкая наборы символов - это UTF, в частности, похоже, что эти функции будут бесполезны в Windows, где локализованное многобайтовое кодирование не позволяет использовать более двух байтов на символ).

Кроме того, они добавили синтаксис u8"" для записи строковых букв UTF-8. Поскольку UTF-8 является кодировкой, совместимой с большинством функций, которые имеют дело с char * и std::string, это одно из самых полезных новых дополнений.

Однако они, похоже, не смогли добавить способ конвертирования между UTF-8, UTF-16 и UTF-32. mbtoc16 и связанные функции преобразуются между многобайтовой кодировкой, определенной реализацией, и UTF-16 или 32; но вы не можете зависеть от этого UTF-8. На Unix-подобных платформах он зависит от локали, и многие из них используют UTF-8 в своей локали по умолчанию, и даже если это не по умолчанию, вы можете по крайней мере установить локаль в локаль UTF-8 для целей знания что "многобайтовый" означает UTF-8. Однако в Windows вы явно не можете использовать UTF-8 или любую другую кодировку, для которой требуется более двух байтов для локали.

Я просто что-то пропустил или это строковый тип UTF-8, который не сопровождается каким-либо образом, чтобы преобразовать его в другие типы строк: определенный платформой многобайт, платформа с широким интерфейсом char, UTF-16 или UTF- 32? Невозможно даже сказать, является ли ваша многобайтовая кодировка системы UTF-8? Есть ли причина, по которой эта поддержка не была включена (в частности, я ищу фактическое письменное обоснование или обсуждение комитетами стандартов C или С++, а не только спекуляции)? Проделана ли какая-либо работа для улучшения этой ситуации; вероятно, улучшится в будущем?

Или, это самое лучшее решение, если вы хотите поддерживать UTF-8 в переносном режиме, написать собственную реализацию, задействовать зависимость от библиотеки или использовать функции, специфичные для платформы, такие как iconv и MultiByteToWideChar

4b9b3361

Ответ 1

Похоже, вы ищете тип std:: codecvt. См. Пример на этой странице для использования.