Создайте std::u8string из std::string/char const*, когда последний уже находится в utf-8
Я занимаюсь обновлением своей базы кода до C++20 и хотел бы использовать
std::u8string
/char8_t
. Я использую стороннюю библиотеку, которая принимает и возвращает строки UTF-8 в своем API, однако она еще не была обновлена до C++20 и, таким образом, принимает и возвращает строки UTF-8 как обычные
std::string
s вместо
std::u8string
с.
Преобразование
std::u8string
к
std::string
довольно прямолинейно, так как
u8string
s может быть доступен через
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
это знаковый тип.