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#類庫:(待續
其中第四種,我的實現始終存在一些問題。 第五種,我只是知道有這麼一種方案,沒有時間去詳細瞭解,算是給一些提示吧。

 

發佈了34 篇原創文章 · 獲贊 3 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章