繁体   English   中英

当 std::string/char const* 已经在 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 我正在使用一个 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::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'\0');
std::memcpy(u8s.data(), s.data(), s.size());

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

有没有办法避免初始化为全零或另一种在std::stringstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM