Создайте std::u8string из std::string/char const*, когда последний уже находится в utf-8

Я занимаюсь обновлением своей базы кода до C++20 и хотел бы использовать std::u8string/char8_t. Я использую стороннюю библиотеку, которая принимает и возвращает строки UTF-8 в своем API, однако она еще не была обновлена ​​до C++20 и, таким образом, принимает и возвращает строки UTF-8 как обычные std::strings вместо std::u8stringс.

Преобразование std::u8string к std::string довольно прямолинейно, так как u8strings может быть доступен через char* указатель, так что

std::u8string u8s = get_data();
std::string s(reinterpret_cast<char const*>(u8s.data()), u8s.size());

правильный код. Однако, насколько мне известно char8_t не имеет исключения псевдонимов, которое std::byte и char иметь, таким образом

std::string s = get_data();
std::u8string u8s{reinterpret_cast<char8_t const*>(s.data()), s.size());

не является допустимым.

Я прибегал к

std::string s = get_data();
std::u8string u8s(s.size(), u8'\0');
std::memcpy(u8s.data(), s.data(), s.size());

на данный момент, но это кажется излишне неэффективным, учитывая, что это сначала инициализирует память всеми нулями перед записью в нее фактических данных.

Есть ли способ избежать инициализации всеми нулями или другой способ преобразования между std::string и std::u8string все вместе?

1 ответ

Решение

u8string u8s(s.begin(), s.end())должно работать нормально. Вам не нужен гипс. Конструктор шаблонный, и char неявно преобразуется в char8_t.

Основной тип char8_t будучи unsigned char не проблема, даже если char это знаковый тип.

Другие вопросы по тегам