几种C++ std::string和std::wstring相互转换的转换方法

几种C++ std::string和std::wstring相互转换的转换方法

第一种方法:调用WideCharToMultiByte()和MultiByteToWideChar(),代码如下(关于详细的解释,可以参考《windows核心编程》):

[cpp]  view plain  copy
  1. #include <string>  
  2. #include <windows.h>  
  3. using namespace std;  
  4. //Converting a WChar string to a Ansi string  
  5. std::string WChar2Ansi(LPCWSTR pwszSrc)  
  6. {  
  7. int nLen = WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, NULL, 0, NULL, NULL);  
  8.   
  9. if (nLen<= 0) return std::string("");  
  10.   
  11. char* pszDst = new char[nLen];  
  12. if (NULL == pszDst) return std::string("");  
  13.   
  14. WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);  
  15. pszDst[nLen -1] = 0;  
  16.   
  17. std::string strTemp(pszDst);  
  18. delete [] pszDst;  
  19.   
  20. return strTemp;  
  21. }  
  22.   
  23. string ws2s(wstring& inputws){ return WChar2Ansi(inputws.c_str()); }  
  24.   
  25. //Converting a Ansi string to WChar string  
  26.   
  27. std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen)  
  28.   
  29. {  
  30. int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);  
  31. if(nSize <= 0) return NULL;  
  32.   
  33. WCHAR *pwszDst = new WCHAR[nSize+1];  
  34. if( NULL == pwszDst) return NULL;  
  35.   
  36. MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pszSrc, nLen, pwszDst, nSize);  
  37. pwszDst[nSize] = 0;  
  38.   
  39. if( pwszDst[0] == 0xFEFF) // skip Oxfeff  
  40. for(int i = 0; i < nSize; i ++)   
  41. pwszDst[i] = pwszDst[i+1];  
  42.   
  43. wstring wcharString(pwszDst);  
  44. delete pwszDst;  
  45.   
  46. return wcharString;  
  47. }  
  48.   
  49. std::wstring s2ws(const string& s){ return Ansi2WChar(s.c_str(),s.size());}  


第二种方法:采用ATL封装_bstr_t的过渡:(注,_bstr_是Microsoft Specific的,所以下面代码可以在VS2005通过,无移植性);

[cpp]  view plain  copy
  1. #include <string>  
  2. #include <comutil.h>  
  3. using namespace std;  
  4. #pragma comment(lib, "comsuppw.lib")  
  5.   
  6. string ws2s(const wstring& ws);  
  7. wstring s2ws(const string& s);  
  8.   
  9. string ws2s(const wstring& ws)  
  10. {  
  11. _bstr_t t = ws.c_str();  
  12. char* pchar = (char*)t;  
  13. string result = pchar;  
  14. return result;  
  15. }  
  16.   
  17. wstring s2ws(const string& s)  
  18. {  
  19. _bstr_t t = s.c_str();  
  20. wchar_t* pwchar = (wchar_t*)t;  
  21. wstring result = pwchar;  
  22. return result;  
  23. }  


第三种方法:使用CRT库的mbstowcs()函数和wcstombs()函数,平台无关,需设定locale。

[cpp]  view plain  copy
  1. #include <string>  
  2. #include <locale.h>  
  3. using namespace std;  
  4. string ws2s(const wstring& ws)  
  5. {  
  6. string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";  
  7.   
  8. setlocale(LC_ALL, "chs");  
  9.   
  10. const wchar_t* _Source = ws.c_str();  
  11. size_t _Dsize = 2 * ws.size() + 1;  
  12. char *_Dest = new char[_Dsize];  
  13. memset(_Dest,0,_Dsize);  
  14. wcstombs(_Dest,_Source,_Dsize);  
  15. string result = _Dest;  
  16. delete []_Dest;  
  17.   
  18. setlocale(LC_ALL, curLocale.c_str());  
  19.   
  20. return result;  
  21. }  
  22.   
  23. wstring s2ws(const string& s)  
  24. {  
  25. setlocale(LC_ALL, "chs");  
  26.   
  27. const char* _Source = s.c_str();  
  28. size_t _Dsize = s.size() + 1;  
  29. wchar_t *_Dest = new wchar_t[_Dsize];  
  30. wmemset(_Dest, 0, _Dsize);  
  31. mbstowcs(_Dest,_Source,_Dsize);  
  32. wstring result = _Dest;  
  33. delete []_Dest;  
  34.   
  35. setlocale(LC_ALL, "C");  
  36.   
  37. return result;  
  38. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值