Linux下string和wstring的转换

来源:互联网 发布:如何建立网络连接 编辑:程序博客网 时间:2024/04/30 08:51

string是单字节字符串,而wstring是宽字节字符串,当涉及到中文字符的时候往往需要在两者之间进行转换,今天自己偶然遇到这个问题,从网上搜罗了一通,稍微做个它们之间转换常用方法的总结吧。

一、string 转 wstring:

1.string source;

   wstring target(source.begin() ,source.end());

这种转换对中文不支持,慎用。

2.调用MultiByteToWideChar():

//Converting a Ansi string to WChar stringstd::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;}

3.采用ATL封装_bstr_t的过渡(_bstr_t是C++对BSTR的封装,它的构造和析构函数分别调用SysAllocString和SysFreeString函数,其他操作是借用BSTR API函数。):

wstring s2ws(const string& s){        _bstr_t t = s.c_str();        wchar_t* pwchar = (wchar_t*)t;        wstring result = pwchar;        return result;}

4.采用CRT库的mbstowcs()函数,与平台无关,需设定locale:

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;}

二、wstring 转 string的方法,与上面相似:

1.调用WideCharToMultiByte():

//Converting a WChar string to a Ansi stringstd::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;}

2.采用ATL封装_bstr_t的过渡:

string ws2s(const wstring& ws){        _bstr_t t = ws.c_str();        char* pchar = (char*)t;        string result = pchar;        return result;}

3.使用CRT库的wcstombs()函数:

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;}



0 0
原创粉丝点击