xuejianhui

导航

宽窄字节转换

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

 

 

 

 

 

posted on 2014-04-14 23:36  xuejianhui  阅读(309)  评论(0编辑  收藏  举报