C++ 为什么';t STL“;正式地;是否支持std::string到std::wstring的转换?

C++ 为什么';t STL“;正式地;是否支持std::string到std::wstring的转换?,c++,string,C++,String,我知道std::string和std::wstring来自相同的基本类型std::basic_string。但是,没有一种“官方”的方法来转换 STD::String < /Cuff>数据到 STD::WString 使用C++ STL?我的意思是Windows提供了MultiByteToWideChar()来转换,但是为什么STL不能提供一个呢 我以前用过std::codecvt来完成它,但现在它说它不推荐使用。为什么STL首先要删除此支持 P.> :ST::String < /C> >未

我知道
std::string
std::wstring
来自相同的基本类型
std::basic_string
。但是,没有一种“官方”的方法来转换<代码> STD::String < /Cuff>数据到 STD::WString 使用C++ STL?我的意思是Windows提供了
MultiByteToWideChar()
来转换,但是为什么STL不能提供一个呢

我以前用过
std::codecvt
来完成它,但现在它说它不推荐使用。为什么STL首先要删除此支持

<> P.>

<字符编码>:ST::String < /C> >未由C++标准定义,<代码> STD::String 可以保存任何可以用1字节< Cuth> char 元素表示的编码,包括UTF 7/8、ISO-859X、Windows 125X等。 此外,
wchar\u t
的大小是由实现定义的,而不是由标准定义的,因此即使是
std::wstring
的编码也可能有所不同。在Windows上,
wchar\u t
是2个字节,因此
std::wstring
使用UCS-2/UTF-16编码。而在其他平台上,
wchar\u t
是4字节,因此
std::wstring
使用UCS-4/UTF-32

因此,没有一种转换能够满足所有平台和用例中所有可能的
std::string std::wstring
转换组合。因此,为了执行转换,您需要知道源字符串的编码和目标字符串的预期编码

是的,C++标准确实提供了<代码> STD::CODECVTT < /C>和 STD::WSTRIGION转换:ST::WBuffelyStuts这个任务,但是它们已经被删除了,正如你们所注意到的。目前还没有提供标准的替代品


因此,最好使用第三方Unicode API/库来处理字符转换。

std::wstring my_-wide_-string{shown_-string.begin(),shown_-string.end()?@NathanOliver该方法仅适用于ASCII字符,不会转换非ASCII字符properly@RemyLebeau实际上,它应该适用于拉丁-1字符集,ASCII是其中的一个子集。这仍然排除了世界上大部分的角色,所以对你来说+1。这是一个好的。这个问题的答案似乎是,C++标准已经把两个编码都留给实现,可以简单地定义存在一个实现定义的转换。甚至可以合理地说,基本集合中的字符将是往返的。@MSalters除了
std::string
编码不是实现定义的之外,它是用户定义的。我想std::wstring也可以这么说,但由于它使用的是实现定义的字符类型,因此限制了用户可以选择使用的编码。我的意思是,你可以将UTF-8单元按原样存储到
std::wstring
,但你为什么要这样做呢?@RemyLebeau:我假设
std::string
编码就是
char
编码,因为它是
std::basic_string
。您可以使用具有其他特征的
basic\u字符串
,但这不是
std::string
charc='a'的编码不是用户定义的,是吗?怎么样?我甚至不记得“由标准定义、实现定义、未指定、未定义”列表中的“用户定义”。@MSalters例如,标准中没有任何内容阻止
char
保留。