首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UTF8到UTF16的转换使用std::UTF16系统::path

UTF8到UTF16的转换使用std::UTF16系统::path
EN

Stack Overflow用户
提问于 2021-06-03 16:58:24
回答 1查看 629关注 0票数 3

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

代码语言:javascript
复制
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,里面有所有可能的转换,例如它有成员

代码语言:javascript
复制
std::string string() const;
std::wstring wstring() const;
std::u8string u8string() const;
std::u16string u16string() const;
std::u32string u32string() const;

因此,上面的函数可以重写如下:

代码语言:javascript
复制
std::wstring utf8ToWide( const char* utf8 )
{
    return std::filesystem::path( (const char8_t*) utf8 ).wstring();
}

std::codecvt_utf8_utf16不同的是,这将不使用任何不推荐的C++。

这种转换器会有什么缺点呢?例如,路径不能超过一定的长度,或者禁止某些Unicode符号?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-03 18:01:23

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

好吧,让我们把最明显的缺点排除掉。对于一个不知道你在做什么的用户来说,这是没有意义的。使用路径类型进行UTF-8到-16转换是疯狂的,应该立即被视为代码气味。这是一种可怕的黑客行为,当你无谓地不愿意下载一个简单的库,就可以正确地完成它。

而且,它不一定要起作用。path是用来存储..。道路。于是就得名了。具体来说,它们的目的是以一种容易被有关文件系统使用的方式存储路径。因此,存储在path中的字符串可以有文件系统想要对其施加的任何限制,而不是C++标准要求它做的大量事情。

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

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

如果您害怕使用不推荐的工具,只需下载一个简单的UTF-8/16转换库即可。或者自己写一个,没那么难。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67825686

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档