Linux下string和wstring的转换

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

一、string 转 wstring:

1.string source;

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

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

2.调用MultiByteToWideChar():

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

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值