c ++无法将字符串转换为wstring

时间:2014-08-05 14:50:19

标签: c++ linux special-characters substr wstring

我想将字符串变量转换为wstring,因为一些德语字符在对变量执行substr时会导致问题。当任何这些特殊字符出现在它之前时,起始位置是伪造的。 (例如:对于“ä”size()返回2而不是1)

我知道以下转换有效:

wstring ws = L"ä";

因为,我正在尝试转换变量,我想知道是否有其他方法,例如

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

除此之外,我已经尝试了以下example将字符串转换为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编译的。谢谢你的帮助!

3 个答案:

答案 0 :(得分:2)

“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

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

再次感谢!

答案 1 :(得分:1)

如果您使用 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);

如果您想了解有关 codepages 的更多信息,请参阅有关Joel on Software的有趣文章:The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets

这些CA2W(将Ansi转换为Wide = unicode)宏是ATL and MFC String Conversion Macros的一部分,包括样本。

有时你需要禁用安全警告#4995',我不知道其他的解决方法(对我而言,当我在VS2012中为WindowsXp编译时会发生这种情况)。

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

修改 好吧,根据this article,乔尔的文章似乎是:“在娱乐时,它对实际的技术细节非常清楚”。文章:What Every Programmer Absolutely, Positively Needs To Know About Encoding And Character Sets To Work With Text

答案 2 :(得分:0)

重点是

string foo("ä")

已经是错误了。从here开始,阅读所有答案。请注意,one是非常错误的:)