[英]Create std::u8string from std::string/char const* when the latter is already in utf-8
我正在将我的代码库升级到 C++20,并想使用std::u8string
/ char8_t
。 我正在使用一个 3rd-party 库,它在其 API 中接受并返回 UTF-8 字符串,但是它尚未更新到 C++20,因此将 UTF-8 字符串作为常规std::string
接受并返回s 而不是std::u8string
s。
将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
和std::u8string
完全转换的方法?
u8string u8s(s.begin(), s.end())
应该可以正常工作。 你不需要演员。 构造函数是模板化的,并且char
隐式转换为char8_t
。
即使char
是有unsigned char
类型, char8_t
的基础类型是unsigned char
也不是问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.