UTF8 到 UTF16 的转换使用 std::filesystem::p ath



从C++11开始,可以使用std::codecvt_utf8_utf16将UTF8转换为UTF16wchar_t(至少在Windows上,wchar_t是16位宽):

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 符号?

这样的转换器会有什么样的缺点?

好吧,让我们把最明显的缺点排除在外。对于不知道你在做什么的用户来说,这是没有意义的。使用路径类型进行 UTF-8 到 16 的转换是疯狂的,应立即被视为代码异味。当您不必要地反对下载一个简单的库可以正确执行此操作时,这就是您所做的那种可怕的黑客。

此外,它不必工作。path用于存储...路径。因此得名。具体来说,它们用于以相关文件系统容易使用的方式存储路径。因此,存储在path中的字符串可以具有文件系统想要施加的任何限制,除了C++标准要求它做的少量事情之外。

例如,如果文件系统不区分大小写(甚至只是 ASCII 不区分大小写),则当它们存储在path中时,让它将所有字符串转换为小写是一个合法的实现。或者当您从path中提取它们时将它们进行大小写转换。或类似的东西。

path可以将您所有的转换为/。或者你的:进入/。或者它想要做的任何其他依赖于实现的技巧。

如果您害怕使用已弃用的工具,只需下载一个简单的 UTF-8/16 转换库即可。或者自己写一个;这并不难。

相关内容

  • 没有找到相关文章

最新更新