首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >字符串/u8字符串和string_view/u8string_view之间的C++20转换

字符串/u8字符串和string_view/u8string_view之间的C++20转换
EN

Stack Overflow用户
提问于 2020-10-08 10:45:19
回答 1查看 1.2K关注 0票数 3

C++20引入了char8_t和相应的u8stringu8string_view等,主要是为了支持更干净的接口和更好地区分窄执行和utf-8字符集。

缺点之一是旧代码可能不再起作用了。

假设我有使用utf-8编码的 std::string / std::string_view (来自C++17)的接口。

如果我想使用C++20采用std::u8string / std::u8string_view的实现,但现在将接口留给std::string,那么在string/string_viewu8string/u8string_view之间转换回和堡垒的最简单方法是使用reinterpret_cast,用于ex:

代码语言:javascript
运行
复制
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;

int main()
{
    SetConsoleOutputCP(CP_UTF8);

    u8string u8s = u8"ä";
    // string s = u8"ä"; OK in C++17, NOK in C++20
    string s(reinterpret_cast<const char*>(u8s.c_str()));
    // or string s(u8s.cbegin(), u8s.cend());
    cout << s << endl;
    u8string u8s2(reinterpret_cast<const char8_t*>(s.c_str()));
    // or u8string u8s2(s.begin(), s.end())

    // string_view
    u8string_view u8sv = u8"ö"sv;
    string_view sv(reinterpret_cast<const char*>(u8sv.data()), u8sv.size());
    cout << sv << endl;
}

你认为这种方法有什么问题,还是有更好的建议?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-08 10:58:30

char8_t具有与char相同的大小和对齐方式,并且是隐式可转换的。

与强制转换和c_str()不同,只需使用迭代器构造函数即可。

代码语言:javascript
运行
复制
u8string u8s = u8"test";
string s(u8s.cbegin(), u8s.cend());
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64260888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档