c + +不能将string转换为wstring

我想将一个stringvariables转换为wstring由于一些德语字符在variables上执行substr时会导致问题。 当这些特殊字符出现之前,起始位置就是伪造的。 (例如:对于“ä”大小()返回2而不是1)

我知道以下转换工作:

wstring ws = L"ä"; 

因为,我想转换一个variables,我想知道是否有一个替代方式,如

 wstring wstr = L"%s"+str //this is syntaxically wrong, but wanted sth alike 

除此之外,我已经尝试了下面的例子将string转换为wstring:

 string foo("ä"); wstring_convert<codecvt_utf8<wchar_t>> converter; wstring wfoo = converter.from_bytes(foo.data()); cout << foo.size() << endl; cout << wfoo.size() << endl; 

,但我得到像这样的错误

 'wstring_convert' was not declared in this scope 

我使用的是Ubuntu 14.04,我的main.cpp是用cmake编译的。 谢谢你的帮助!

“hahakubile”的解决方案为我工作:

 std::wstring s2ws(const std::string& s) { std::string curLocale = setlocale(LC_ALL, ""); const char* _Source = s.c_str(); size_t _Dsize = mbstowcs(NULL, _Source, 0) + 1; wchar_t *_Dest = new wchar_t[_Dsize]; wmemset(_Dest, 0, _Dsize); mbstowcs(_Dest,_Source,_Dsize); std::wstring result = _Dest; delete []_Dest; setlocale(LC_ALL, curLocale.c_str()); return result; } 

但是,返回值不是100%正确的:

 string s = "101446012MaßnStörfall PAt #Maßnahme Störfall 00810000100121000102000020100000000000000"; wstring ws2 = s2ws(s); cout << ws2.size() << endl; // returns 110 which is correct wcout << ws2.substr(29,40) << endl; // returns #Ma nahme St rfall with symbols 

我想知道为什么用符号代替德文字符。

再次感谢!

如果您使用Windows / Visual Studio并需要将字符串转换为wstring,则应使用:

 #include <AtlBase.h> #include <atlconv.h> ... string s = "some string"; CA2W ca2w(s.c_str()); wstring w = ca2w; printf("%s = %ls", s.c_str(), w.c_str()); 

将wstring转换为字符串的相同过程(有时您需要指定一个代码页 ):

 #include <AtlBase.h> #include <atlconv.h> ... wstring w = L"some wstring"; CW2A cw2a(w.c_str()); string s = cw2a; printf("%s = %ls", s.c_str(), w.c_str()); 

你可以指定一个代码页 ,甚至UTF8(使用JNI / Java时,这是相当不错的)。

 CA2W ca2w(str, CP_UTF8); 

如果您想了解更多关于代码页的信息 ,可以参阅关于Joel on Software的一篇有趣的文章: 绝对最小化每个软件开发人员绝对肯定必须了解Unicode和字符集 。

这些CA2W(将Ansi转换为Wide = unicode)宏是ATL和MFC字符串转换宏的一部分 ,包括样本。

有时你需要禁用安全警告#4995',我不知道其他解决方法(对于我在VS2012中编译WindowsXp时发生的)。

 #pragma warning(push) #pragma warning(disable: 4995) #include <AtlBase.h> #include <atlconv.h> #pragma warning(pop) 

编辑:好吧,根据这篇文章,Joel的文章似乎是:“而娱乐,实际技术细节上很轻。 文章: 每个程序员绝对,积极需要知道编码和字符集与文本工作 。

重点是这个

 string foo("ä") 

已经是一个错误。 从这里开始阅读所有答案。 而且要小心, 一个是非常错误的:)