我正在将代码库升级到C ++ 20,并且想使用std::u8string
/ char8_t
。我正在使用一个第三方库,该库在其API中采用并返回UTF-8字符串,但是尚未将其更新为C ++ 20,因此采用常规{{1} } s代替std::string
s。
将std::u8string
转换为std::u8string
很简单,因为std::string
的缓冲区可以通过u8string
指针进行访问,所以
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
之间进行转换的另一种方式?
答案 0 :(得分:1)
u8string u8s(s.begin(), s.end())
应该可以正常工作。您不需要演员表。构造函数是模板化的,并且char
隐式转换为char8_t
。
char8_t
的基础类型为unsigned char
并不是问题,即使char
是带符号类型。