【问题标题】:C++20 converting between string/u8string and string_view/u8string_viewC++20 在 string/u8string 和 string_view/u8string_view 之间转换
【发布时间】:2020-10-08 10:45:19
【问题描述】:

C++20 引入了char8_t 和相应的u8stringu8string_view 等,主要用于支持更简洁的界面以及更好地区分窄执行和utf-8 字符集。

其中一个缺点是旧代码可能不再有效。

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

如果我想使用std::u8string / std::u8string_view 将实现应用到C++20,但目前将接口留给std::string,那么在string/string_viewu8string/u8string_view 之间转换的最简单方法是使用reinterpret_cast,例如:

#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;
}

你觉得这种方法有什么问题,或者有更好的建议吗?

【问题讨论】:

    标签: c++ c++17 c++20


    【解决方案1】:

    char8_tchar 具有相同的大小和对齐方式,并且可以隐式转换。

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

    u8string u8s = u8"test";
    string s(u8s.cbegin(), u8s.cend());
    

    【讨论】:

    • 您可能仍需要 reinterpret_cast 才能查看。但是对于拥有字符串,迭代器构造函数会做正确的事情。
    猜你喜欢
    • 2023-03-05
    • 2021-08-18
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多