VS2005:C++ std::string, std::wstring转换方法

 


文章出处:http://www.ecjtu.org/forum/read.php?tid-18304.html

随着VS2003升级到VS2005,很多以前熟悉的输入输出方式以及参数传递方式都不再有效(参看 vs2003 到vs2005代码升级要点http://www.ecjtu.org/forum/htm_data/59/0806/18303.html)。其中根字符串相关的内容是,wcout不再有效,默认参数传递方式由char*改成了wchar_t*等几个方面。为了解决上面的这些问题,这篇文章里,我将给出几种C++ std::string和std::wstring相互转换的转换方法

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

复制代码
  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. if (nLen<= 0) return std::string("");
  9. char* pszDst = new char[nLen];
  10. if (NULL == pszDst) return std::string("");
  11. WideCharToMultiByte(CP_ACP, 0, pwszSrc, -1, pszDst, nLen, NULL, NULL);
  12. pszDst[nLen -1] = 0;
  13. std::string strTemp(pszDst);
  14. delete [] pszDst;
  15. return strTemp;
  16. }
  17. string ws2s(wstring& inputws){ return WChar2Ansi(inputws.c_str()); }

//Converting a Ansi string to WChar string
复制代码
  1. std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen)
  2. {
  3. int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);
  4. if(nSize <= 0) return NULL;
  5. WCHAR *pwszDst = new WCHAR[nSize+1];
  6. if( NULL == pwszDst) return NULL;
  7. MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pszSrc, nLen, pwszDst, nSize);
  8. pwszDst[nSize] = 0;
  9. if( pwszDst[0] == 0xFEFF) // skip Oxfeff
  10. for(int i = 0; i < nSize; i ++)
  11. pwszDst[i] = pwszDst[i+1];
  12. wstring wcharString(pwszDst);
  13. delete pwszDst;
  14. return wcharString;
  15. }
  16. std::wstring s2ws(const string& s){ return Ansi2WChar(s.c_str(),s.size());}


第二种方法:采用ATL封装_bstr_t的过渡:(注,_bstr_是Microsoft Specific的,所以下面代码可以在VS2005通过,无移植性);
复制代码
  1. #include <string>
  2. #include <comutil.h>
  3. using namespace std;
  4. #pragma comment(lib, "comsuppw.lib")
  5. string ws2s(const wstring& ws);
  6. wstring s2ws(const string& s);
  7. string ws2s(const wstring& ws)
  8. {
  9. _bstr_t t = ws.c_str();
  10. char* pchar = (char*)t;
  11. string result = pchar;
  12. return result;
  13. }
  14. wstring s2ws(const string& s)
  15. {
  16. _bstr_t t = s.c_str();
  17. wchar_t* pwchar = (wchar_t*)t;
  18. wstring result = pwchar;
  19. return result;
  20. }


第三种方法:使用CRT库的mbstowcs()函数和wcstombs()函数,平台无关,需设定locale。
复制代码
  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. setlocale(LC_ALL, "chs");
  8. const wchar_t* _Source = ws.c_str();
  9. size_t _Dsize = 2 * ws.size() + 1;
  10. char *_Dest = new char[_Dsize];
  11. memset(_Dest,0,_Dsize);
  12. wcstombs(_Dest,_Source,_Dsize);
  13. string result = _Dest;
  14. delete []_Dest;
  15. setlocale(LC_ALL, curLocale.c_str());
  16. return result;
  17. }
  18. wstring s2ws(const string& s)
  19. {
  20. setlocale(LC_ALL, "chs");
  21. const char* _Source = s.c_str();
  22. size_t _Dsize = s.size() + 1;
  23. wchar_t *_Dest = new wchar_t[_Dsize];
  24. wmemset(_Dest, 0, _Dsize);
  25. mbstowcs(_Dest,_Source,_Dsize);
  26. wstring result = _Dest;
  27. delete []_Dest;
  28. setlocale(LC_ALL, "C");
  29. return result;
  30. }


//第四种方法,标准C++转换方法:(待续)
//第五种方法,在C++中使用C#类库:(待续
其中第四种,我的实现始终存在一些问题。 第五种,我只是知道有这么一种方案,没有时间去详细了解,算是给一些提示吧。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值