使用 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;
所以上面的函数可以重写为:
std::wstring utf8ToWide( const char* utf8 )
{
return std::filesystem::path( (const char8_t*) utf8 ).wstring();
}
与 std::codecvt_utf8_utf16
不同的是,这不会使用任何已弃用的 C++。
这种转换器会有哪些缺点?例如,路径不能超过一定长度或那里禁止某些Unicode符号?
What kind of drawbacks can be expected from such converter?
好吧,让我们排除最明显的缺点。对于不知道您在做什么的用户来说,这毫无意义。使用 路径类型 进行 UTF-8 到 16 的转换是疯狂的,应该立即被视为一种代码味道。当您不必要地反对只下载一个可以正确执行它的简单库时,这是您所做的那种可怕的黑客行为。
此外,它不一定有效。 path
用于存储...路径。由此得名。具体来说,它们旨在以一种易于被相关文件系统使用的方式存储路径。因此,存储在 path
中的字符串可以有文件系统想要对其施加的任何限制,除了 C++ 标准要求它做的一小部分事情之外。
例如,如果文件系统不区分大小写(或者甚至只是 ASCII 不区分大小写),当它们存储在 path
。或者在从 path
中提取它们时将它们进行大小写转换。或类似的东西。
path
可以将您所有的 \
转换为 /
。或者你的 :
变成 /
。或者它想做的任何其他依赖于实现的技巧。
如果您害怕使用已弃用的工具,只需下载一个简单的 UTF-8/16 转换库即可。或者自己写一个;没那么难。
从 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;
所以上面的函数可以重写为:
std::wstring utf8ToWide( const char* utf8 )
{
return std::filesystem::path( (const char8_t*) utf8 ).wstring();
}
与 std::codecvt_utf8_utf16
不同的是,这不会使用任何已弃用的 C++。
这种转换器会有哪些缺点?例如,路径不能超过一定长度或那里禁止某些Unicode符号?
What kind of drawbacks can be expected from such converter?
好吧,让我们排除最明显的缺点。对于不知道您在做什么的用户来说,这毫无意义。使用 路径类型 进行 UTF-8 到 16 的转换是疯狂的,应该立即被视为一种代码味道。当您不必要地反对只下载一个可以正确执行它的简单库时,这是您所做的那种可怕的黑客行为。
此外,它不一定有效。 path
用于存储...路径。由此得名。具体来说,它们旨在以一种易于被相关文件系统使用的方式存储路径。因此,存储在 path
中的字符串可以有文件系统想要对其施加的任何限制,除了 C++ 标准要求它做的一小部分事情之外。
例如,如果文件系统不区分大小写(或者甚至只是 ASCII 不区分大小写),当它们存储在 path
。或者在从 path
中提取它们时将它们进行大小写转换。或类似的东西。
path
可以将您所有的 \
转换为 /
。或者你的 :
变成 /
。或者它想做的任何其他依赖于实现的技巧。
如果您害怕使用已弃用的工具,只需下载一个简单的 UTF-8/16 转换库即可。或者自己写一个;没那么难。