【发布时间】:2020-10-08 10:45:19
【问题描述】:
C++20 引入了char8_t 和相应的u8string、u8string_view 等,主要用于支持更简洁的界面以及更好地区分窄执行和utf-8 字符集。
其中一个缺点是旧代码可能不再有效。
假设我有使用 utf-8 编码 std::string / std::string_view(来自 C++17)的接口。
如果我想使用std::u8string / std::u8string_view 将实现应用到C++20,但目前将接口留给std::string,那么在string/string_view 和u8string/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;
}
你觉得这种方法有什么问题,或者有更好的建议吗?
【问题讨论】: