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

Create std::u8string from std::string/char const* when the latter is already in utf-8

我正在将我的代码库升级到 C++20,我想使用 std::u8string/char8_t。我正在使用第 3 方库,该库在其 API 中采用 and returns UTF-8 字符串,但它尚未更新为 C++20,因此采用 and returns UTF-8 字符串作为常规 std::strings 而不是 std::u8strings.

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

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

是有效代码。但是,据我所知 char8_t 没有 std::bytechar 所具有的别名豁免,因此

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'[=14=]');
std::memcpy(u8s.data(), s.data(), s.size());

就目前而言,但这似乎不必要地低效,因为这首先将内存初始化为全零,然后再将实际数据写入其中。

有没有办法避免初始化为全零或另一种在 std::stringstd::u8string 之间完全转换的方法?

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

即使 char 是有符号类型,char8_t 的基础类型是 unsigned char 也不是问题。