当std :: string / char const *已经在utf-8中时,从std :: string / char const *创建std :: u8string

时间:2020-09-24 14:42:35

标签: c++ string char8-t

我正在将代码库升级到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_tstd::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之间进行转换的另一种方式?

1 个答案:

答案 0 :(得分:1)

u8string u8s(s.begin(), s.end())应该可以正常工作。您不需要演员表。构造函数是模板化的,并且char隐式转换为char8_t

char8_t的基础类型为unsigned char并不是问题,即使char是带符号类型。