关于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 }

浙公网安备 33010602011771号