繁体   English   中英

使用 std::filesystem::path 将 UTF8 转换为 UTF16

[英]UTF8 to UTF16 conversion using std::filesystem::path

从 C++11 开始,可以使用std::codecvt_utf8_utf16将 UTF8 转换为 UTF16 wchar_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;

所以上面的function可以改写如下:

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可以将你所有的\ s转换成/ s。 或者你的: s 变成/ s。 或者它想要做的任何其他依赖于实现的技巧。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM