从C++11开始,可以使用std::codecvt_utf8_utf16将UTF8转换为UTF16 wchar_t (至少在wchar_t为16位宽的Windows上)
std::wstring utf8ToWide( const char* utf8 )
{
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
return converter.from_bytes( utf8 );
}不幸的是,在C++17中,不推荐std::codecvt_utf8_utf16。但是有std::filesystem::path,里面有所有可能的转换,例如它有成员
std::string string() const;
std::wstring wstring() const;
std::u8string u8string() const;
std::u16string u16string() const;
std::u32string u32string() const;因此,上面的函数可以重写如下:
std::wstring utf8ToWide( const char* utf8 )
{
return std::filesystem::path( (const char8_t*) utf8 ).wstring();
}与std::codecvt_utf8_utf16不同的是,这将不使用任何不推荐的C++。
这种转换器会有什么缺点呢?例如,路径不能超过一定的长度,或者禁止某些Unicode符号?
发布于 2021-06-03 18:01:23
这样的转换器会有什么样的缺点?
好吧,让我们把最明显的缺点排除掉。对于一个不知道你在做什么的用户来说,这是没有意义的。使用路径类型进行UTF-8到-16转换是疯狂的,应该立即被视为代码气味。这是一种可怕的黑客行为,当你无谓地不愿意下载一个简单的库,就可以正确地完成它。
而且,它不一定要起作用。path是用来存储..。道路。于是就得名了。具体来说,它们的目的是以一种容易被有关文件系统使用的方式存储路径。因此,存储在path中的字符串可以有文件系统想要对其施加的任何限制,而不是C++标准要求它做的大量事情。
例如,如果文件系统不区分大小写(甚至只区分ASCII大小写),那么将所有字符串存储在path中时将其大小写转换为小写是一种合法的实现。或者当你从一个path中提取它们的时候,将它们转换成案例。或者其他类似的东西。
path可以将您所有的\转换为/,或者将您的:转换为/,或者它想做的任何其他依赖于实现的技巧。
如果您害怕使用不推荐的工具,只需下载一个简单的UTF-8/16转换库即可。或者自己写一个,没那么难。
https://stackoverflow.com/questions/67825686
复制相似问题