简单的方法:CString --> std::string
CStringW cstrw = _T("lala薛建辉"); CStringA cstra = CStringA(cstrw.GetBuffer(0)); cstrw.ReleaseBuffer(); std::string stra = cstra.GetBuffer(0); cstra.ReleaseBuffer();
复杂的方法:
第一种方法:调用 WideCharToMultiByte()和 MultiByteToWideChar(),代码如下: 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 Wstr2Str(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 Str2Wstr( const string& s ) { return Ansi2WChar(s.c_str(), s.size()); } ---------------------------------------------------------------------------------- 第二种方法:采用ATL封装_bstr_t的过渡:(注,_bstr_是Microsoft Specific的,所以下面代码可以在VS2005通过,无移植性); 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。 CRT : C runtime library(part of the C standard library) #include <string> 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; } wstring s2ws(const string& s) { 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); wstring result = _Dest; delete []_Dest; setlocale(LC_ALL, "C"); return result; }