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

C++ 当std::string/char const*已在utf-8中时,从std::string/char const*创建std::u8string,c++,string,char8-t,C++,String,Char8 T,我正在将代码库升级到C++20,并希望使用std::u8string/char8\u t。我使用的第三方库在其API中获取并返回UTF-8字符串,但它尚未更新为C++20,因此将UTF-8字符串作为常规std::strings而不是std::u8strings获取并返回 将std::u8string转换为std::string非常简单,因为u8strings缓冲区可以通过char*指针访问,所以 std::u8string u8s = get_data(); std::string s(rein

我正在将代码库升级到C++20,并希望使用
std::u8string
/
char8\u t
。我使用的第三方库在其API中获取并返回UTF-8字符串,但它尚未更新为C++20,因此将UTF-8字符串作为常规
std::string
s而不是
std::u8string
s获取并返回

std::u8string
转换为
std::string
非常简单,因为
u8string
s缓冲区可以通过
char*
指针访问,所以

std::u8string u8s = get_data();
std::string s(reinterpret_cast<char const*>(u8s.data()), u8s.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
之间进行转换?

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


char8\u t
的基本类型为
无符号字符
,即使
char
是有符号类型,也不是问题。

u8string u8s(s.begin(),s.end())也许吧。我假设将
char
转换为
char8\u t
没有问题,但我不熟悉
char8\u t
将std::u8string转换为std::string非常简单,
只有当
std::string
中的文本也使用
UTF-8
编码时才可以。@MarekR,但这是我之前明确提出的假设。谢谢。出于某种原因,我假设
char8_t
char
不会因为指针
char8_t*
char*
不是。。。
std::string s = get_data();
std::u8string u8s(s.size(), u8'\0');
std::memcpy(u8s.data(), s.data(), s.size());