C++20 引入了char8_t相应的等u8string,u8string_view主要是为了支持更清晰的接口以及更好地区分窄执行和 utf-8 字符集。
缺点之一是旧代码可能不再起作用。
\n假设我有使用utf-8 编码 std::string/ std::string_view(来自 C++17)的接口。
如果我想采用 C++20 的实现,std::u8string / std::u8string_view但目前将接口保留给,那么在和std::string之间来回转换的最简单方法将是使用,例如:string/string_viewu8string/u8string_viewreinterpret_cast
#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}\nRun Code Online (Sandbox Code Playgroud)\n您认为这种方法有什么问题吗?或者有更好的建议吗?
\nchar8_t与 具有相同的大小和对齐方式char,并且可以隐式转换。
只需使用迭代器构造函数即可代替强制转换和c_str()。
u8string u8s = u8"test";
string s(u8s.cbegin(), u8s.cend());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2658 次 |
| 最近记录: |