C++20引入了char8_t
和相应的u8string
、u8string_view
等,主要是为了支持更干净的接口和更好地区分窄执行和utf-8字符集。
缺点之一是旧代码可能不再起作用了。
假设我有使用utf-8编码的 std::string
/ std::string_view
(来自C++17)的接口。
如果我想使用C++20采用std::u8string / std::u8string_view
的实现,但现在将接口留给std::string
,那么在string/string_view
和u8string/u8string_view
之间转换回和堡垒的最简单方法是使用reinterpret_cast
,用于ex:
#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;
}
你认为这种方法有什么问题,还是有更好的建议?
发布于 2020-10-08 10:58:30
char8_t
具有与char
相同的大小和对齐方式,并且是隐式可转换的。
与强制转换和c_str()
不同,只需使用迭代器构造函数即可。
u8string u8s = u8"test";
string s(u8s.cbegin(), u8s.cend());
https://stackoverflow.com/questions/64260888
复制相似问题