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>数据到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>和
因此,最好使用第三方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
保留。