当后者已经在 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::string
s 而不是 std::u8string
s.
将 std::u8string
转换为 std::string
非常简单,因为可以通过 char*
指针访问 u8string
s 缓冲区,因此
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'[=14=]');
std::memcpy(u8s.data(), s.data(), s.size());
就目前而言,但这似乎不必要地低效,因为这首先将内存初始化为全零,然后再将实际数据写入其中。
有没有办法避免初始化为全零或另一种在 std::string
和 std::u8string
之间完全转换的方法?
u8string u8s(s.begin(), s.end())
应该可以正常工作。你不需要演员表。构造函数是模板化的,char
隐式转换为 char8_t
.
即使 char
是有符号类型,char8_t
的基础类型是 unsigned char
也不是问题。
我正在将我的代码库升级到 C++20,我想使用 std::u8string
/char8_t
。我正在使用第 3 方库,该库在其 API 中采用 and returns UTF-8 字符串,但它尚未更新为 C++20,因此采用 and returns UTF-8 字符串作为常规 std::string
s 而不是 std::u8string
s.
将 std::u8string
转换为 std::string
非常简单,因为可以通过 char*
指针访问 u8string
s 缓冲区,因此
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'[=14=]');
std::memcpy(u8s.data(), s.data(), s.size());
就目前而言,但这似乎不必要地低效,因为这首先将内存初始化为全零,然后再将实际数据写入其中。
有没有办法避免初始化为全零或另一种在 std::string
和 std::u8string
之间完全转换的方法?
u8string u8s(s.begin(), s.end())
应该可以正常工作。你不需要演员表。构造函数是模板化的,char
隐式转换为 char8_t
.
即使 char
是有符号类型,char8_t
的基础类型是 unsigned char
也不是问题。