宽窄字节转换

简单的方法: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;

}

 

 

 

 

 

你可能感兴趣的:(转换)