Jeśli korzystasz z systemu Windows / Visual Studio i chcesz przekonwertować ciąg na wstring, możesz użyć:
#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());
Ta sama procedura konwertowania wstring na łańcuch znaków (czasami trzeba określić stronę kodową ):
#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());
Możesz określić stronę kodową, a nawet UTF8 (to całkiem przyjemne podczas pracy z JNI / Java ). W tej odpowiedzi pokazano standardowy sposób konwersji std :: wstring na utf8 std :: string .
//
// using ATL
CA2W ca2w(str, CP_UTF8);
//
// or the standard way taken from the answer above
#include <codecvt>
#include <string>
// convert UTF-8 string to wstring
std::wstring utf8_to_wstring (const std::string& str) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.from_bytes(str);
}
// convert wstring to UTF-8 string
std::string wstring_to_utf8 (const std::wstring& str) {
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.to_bytes(str);
}
Jeśli chcesz dowiedzieć się więcej o stronach kodowych , jest ciekawy artykuł o Joel na temat oprogramowania: absolutne minimum Każdy programista Absolutnie, pozytywnie musi wiedzieć o Unicode i zestawach znaków .
Te makra CA2W (Convert Ansi to Wide = unicode) są częścią makr konwersji ciągów ATL i MFC , w tym przykłady.
Czasami będziesz musiał wyłączyć ostrzeżenie o zabezpieczeniach # 4995 ', nie znam innego obejścia (dla mnie to się zdarza, gdy kompilowałem dla WindowsXp w VS2012).
#pragma warning(push)
#pragma warning(disable: 4995)
#include <AtlBase.h>
#include <atlconv.h>
#pragma warning(pop)
Edycja:
Cóż, zgodnie z tym artykułem artykuł Joela wygląda na: „podczas rozrywki, jest dość lekki, jeśli chodzi o rzeczywiste szczegóły techniczne”. Artykuł: Co każdy programista absolutnie i pozytywnie powinien wiedzieć o kodowaniu i zestawach znaków do pracy z tekstem .
strings
akceptuje znaków> 8-bitowych. Czy jest już zakodowany w UTF-8?