转自百度文库
第一种方法:调用WideCharToMultiByte()和MultiByteToWideChar(),代码如下(关于详细的解释,可以参考《windows核心编程》): #include <string> #include <windows.h> using namespace std; 
//Converting a WChar string to a Ansi string std::string WChar2Ansi(LPCWSTR pwszSrc) { 
int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL); if (nLen<= 0) return std::string(""); char* pszDst = new char[nLen]; 
if (NULL == pszDst) return std::string(""); 
WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL); pszDst[nLen -1] = 0; std::string strTemp(pszDst); delete [] pszDst; return strTemp; } 
string ws2s(wstring& inputws){ return WChar2Ansi(inputws.c_str()); } //Converting a Ansi string to WChar string 
std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen) { 
int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0); if(nSize <= 0) return NULL; 
WCHAR *pwszDst = new WCHAR[nSize+1]; if( NULL == pwszDst) return NULL; 
MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pszSrc, nLen, pwszDst, nSize); pwszDst[nSize] = 0; 
if( pwszDst[0] == 0xFEFF) // skip Oxfeff for(int i = 0; i < nSize; i ++)  pwszDst[i] = pwszDst[i+1];  wstring wcharString(pwszDst); delete pwszDst; return wcharString; } 
std::wstring s2ws(const string& s){ return Ansi2WChar(s.c_str(),s.size());}  
第二种方法:采用ATL封装_bstr_t的过渡:(注,_bstr_是Microsoft Specific的,所以下面代码可以在VS2005通过,无移植性); #include <string> #include <comutil.h> using namespace std; 


#pragma comment(lib, "comsuppw.lib")  string ws2s(const wstring& ws); wstring s2ws(const string& s); string ws2s(const wstring& ws) { 
_bstr_t t = ws.c_str(); char* pchar = (char*)t; string result = pchar; return result; } 
wstring s2ws(const string& s) { 
_bstr_t t = s.c_str(); 
wchar_t* pwchar = (wchar_t*)t; wstring result = pwchar; return result; } 
第三种方法:使用CRT库的mbstowcs()函数和wcstombs()函数,平台无关,需设定locale。 #include <string> #include <locale.h> using namespace std; 
string ws2s(const wstring& ws) { 
string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C"; setlocale(LC_ALL, "chs");  
const wchar_t* _Source = ws.c_str(); size_t _Dsize = 2 * ws.size() + 1; char *_Dest = new char[_Dsize]; memset(_Dest,0,_Dsize); 
wcstombs(_Dest,_Source,_Dsize); string result = _Dest; delete []_Dest; 
setlocale(LC_ALL, curLocale.c_str()); return result; } 
std::wstring s2ws(const std::string& s) { 
      std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";       setlocale(LC_ALL, "chs");        const char* _Source = s.c_str();       size_t _Dsize = s.size() + 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; }  

posted on 2014-03-20 22:29  言止予思  阅读(761)  评论(0编辑  收藏  举报