C++20 string/u8string 和 string_view/u8string_view 之间的转换

StP*_*ere 5 c++ c++17 c++20

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

\n

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

\n

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

\n

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

\n
#include <iostream>\n#include <string>\n#include <windows.h>\nusing namespace std;\n\nint main()\n{\n    SetConsoleOutputCP(CP_UTF8);\n\n    u8string u8s = u8"\xc3\xa4";\n    // string s = u8"\xc3\xa4"; OK in C++17, NOK in C++20\n    string s(reinterpret_cast<const char*>(u8s.c_str()));\n    // or string s(u8s.cbegin(), u8s.cend());\n    cout << s << endl;\n    u8string u8s2(reinterpret_cast<const char8_t*>(s.c_str()));\n    // or u8string u8s2(s.begin(), s.end())\n\n    // string_view\n    u8string_view u8sv = u8"\xc3\xb6"sv;\n    string_view sv(reinterpret_cast<const char*>(u8sv.data()), u8sv.size());\n    cout << sv << endl;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

您认为这种方法有什么问题吗?或者有更好的建议吗?

\n

Fil*_*ipp 7

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

只需使用迭代器构造函数即可代替强制转换和c_str()

u8string u8s = u8"test";
string s(u8s.cbegin(), u8s.cend());
Run Code Online (Sandbox Code Playgroud)