string和wstring相互转换
时间: 2009.01.03 01:44:00
标签:
string和wstring相互转换
2008-04-10 10:29
随着
VS2003
升级到
VS2005
,很多以前熟悉的输入输出方式以及参数传递方式都不再有效(参看
vs2003
到
vs2005
代码升级要点
http://bianyongtao.spaces.live.com/blog/cns!DD6CD3607CCE4603!214.entry
)。其中根字符串相关的内容是,
wcout
不再有效,默认参数传递方式由
char*
改成了
wchar_t*
等几个方面。为了解决上面的这些问题,这篇文章里,我将给出几种
C++ std::string
和
std::wstring
相互转换的转换方法。
第一种方法:调用 WideCharToMultiByte() 和 MultiByteToWideChar() ,代码如下(关于详细的解释,可以参考《 windows 核心编程》): #include <string> #include <windows.h> using namespace std; //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; } string ws2s(wstring& inputws){ return WChar2Ansi(inputws.c_str()); } //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; } std::wstring s2ws(const string& s){ return Ansi2WChar(s.c_str(),s.size());} 第二种方法:采用 ATL 封装 _bstr_t 的过渡:(注, _bstr_ 是 Microsoft Specific 的,所以下面代码可以在 VS2005 通过,无移植性); #include <string> #include <comutil.h> using namespace std; #pragma comment(lib, "comsuppw.lib") string ws2s(const wstring& ws); wstring s2ws(const string& s); string ws2s(const wstring& ws) { _bstr_t t = ws.c_str(); char* pchar = (char*)t; string result = pchar; return result; } wstring s2ws(const string& s) { _bstr_t t = s.c_str(); wchar_t* pwchar = (wchar_t*)t; wstring result = pwchar; return result; } 第三种方法:使用 CRT 库的 mbstowcs() 函数和 wcstombs() 函数,平台无关,需设定 locale 。 #include <string> #include <locale.h> using namespace std; 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; } 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; } // 第四种方法,标准 C++ 转换方法:(待续) // 第五种方法,在 C++ 中使用 C# 类库:(待续 其中第四种,我的实现始终存在一些问题。 第五种,我只是知道有这么一种方案,没有时间去详细了解,算是给一些提示吧。 |