关于string和wstring互相转换的几种方法

第一种方法:调用WideCharToMultiByte()和MultiByteToWideChar(),代码如下(关于详细的解释,可以参考《windows核心编程》

 1 #include <string>
 2 #include <windows.h>
 3 using namespace std;
 4 //Converting a WChar string to a Ansi string
 5 std::string WChar2Ansi(LPCWSTR pwszSrc)
 6 {
 7 int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);
 8 
 9 if (nLen<= 0) return std::string("");
10 
11 char* pszDst = new char[nLen];
12 if (NULL == pszDst) return std::string("");
13 
14 WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
15 pszDst[nLen -1] = 0;
16 
17 std::string strTemp(pszDst);
18 delete [] pszDst;
19 
20 return strTemp;
21 }
22 
23 string ws2s(wstring& inputws){ return WChar2Ansi(inputws.c_str()); }
24 
25 //Converting a Ansi string to WChar string
26 
27 std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen)
28 
29 {
30 int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);
31 if(nSize <= 0) return NULL;
32 
33 WCHAR *pwszDst = new WCHAR[nSize+1];
34 if( NULL == pwszDst) return NULL;
35 
36 MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pszSrc, nLen, pwszDst, nSize);
37 pwszDst[nSize] = 0;
38 
39 if( pwszDst[0] == 0xFEFF) // skip Oxfeff
40 for(int i = 0; i < nSize; i ++) 
41 pwszDst[i] = pwszDst[i+1];
42 
43 wstring wcharString(pwszDst);
44 delete pwszDst;
45 
46 return wcharString;
47 }
48 
49 std::wstring s2ws(const string& s){ return Ansi2WChar(s.c_str(),s.size());}

第二种方法:采用ATL封装_bstr_t的过渡:(注,_bstr_是Microsoft Specific的,所以下面代码可以在VS2005通过,无移植性);

 1 #include <string>
 2 #include <comutil.h>
 3 using namespace std;
 4 #pragma comment(lib, "comsuppw.lib")
 5 
 6 string ws2s(const wstring& ws);
 7 wstring s2ws(const string& s);
 8 
 9 string ws2s(const wstring& ws)
10 {
11 _bstr_t t = ws.c_str();
12 char* pchar = (char*)t;
13 string result = pchar;
14 return result;
15 }
16 
17 wstring s2ws(const string& s)
18 {
19 _bstr_t t = s.c_str();
20 wchar_t* pwchar = (wchar_t*)t;
21 wstring result = pwchar;
22 return result;
23 }

第三种方法:使用CRT库的mbstowcs()函数和wcstombs()函数,平台无关,需设定locale。

 1 #include <string>
 2 #include <locale.h>
 3 using namespace std;
 4 string ws2s(const wstring& ws)
 5 {
 6 string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";
 7 
 8 setlocale(LC_ALL, "chs");
 9 
10 const wchar_t* _Source = ws.c_str();
11 size_t _Dsize = 2 * ws.size() + 1;
12 char *_Dest = new char[_Dsize];
13 memset(_Dest,0,_Dsize);
14 wcstombs(_Dest,_Source,_Dsize);
15 string result = _Dest;
16 delete []_Dest;
17 
18 setlocale(LC_ALL, curLocale.c_str());
19 
20 return result;
21 }
22 
23 wstring s2ws(const string& s)
24 {
25 setlocale(LC_ALL, "chs");
26 
27 const char* _Source = s.c_str();
28 size_t _Dsize = s.size() + 1;
29 wchar_t *_Dest = new wchar_t[_Dsize];
30 wmemset(_Dest, 0, _Dsize);
31 mbstowcs(_Dest,_Source,_Dsize);
32 wstring result = _Dest;
33 delete []_Dest;
34 
35 setlocale(LC_ALL, "C");
36 
37 return result;
38 }

 

posted @ 2017-08-09 10:35  /***Anonymous***/  阅读(175)  评论(0)    收藏  举报