zoukankan      html  css  js  c++  java
  • 宽窄字节转换

    简单的方法: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;
    }
  • 相关阅读:
    python之enumerate枚举 第二篇(六):enumerate枚举
    git使用学习
    Git安装
    eclipse对项目整理分类
    Java基础学习总结——Java对象的序列化和反序列化
    工作代码实例
    substring与substr
    第一个jave程序-helloworld
    UI自动化
    sikuli实例
  • 原文地址:https://www.cnblogs.com/xuejianhui/p/3665234.html
Copyright © 2011-2022 走看看