几种C++ std::string和std::wstring相互转换的转换方法
2015-04-21 09:52
387 查看
第一种方法:调用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 stringstd::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++ std::string和std::wstring相互转换的转换方法
- 几种C++ std::string和std::wstring相互转换的转换方法
- 几种C++ std::string和std::wstring相互转换的转换方法(转)
- 几种C++ std::string和std::wstring相互转换的转换方法
- 几种C++ std::string和std::wstring相互转换的转换方法
- 几种C++ std::string和std::wstring相互转换的转换方法
- 几种C++ std::string和std::wstring相互转换的转换方法
- 几种C++ std::string和std::wstring相互转换的转换方法(转)
- VS2005:C++ std::string, std::wstring转换方法
- VS2005:C++ std::string, std::wstring转换方法
- VS2005:C++ std::string, std::wstring转换方法
- VS2005:C++ std::string, std::wstring转换方法
- string和wstring相互转换方法,标准C++做成,可以在Linux、Windows下运行
- 用标准C++做的string和wstring相互转换方法,经过大规模测试
- std::string和std::wstring相互转换的转换方法(转)
- {wchar_t*, wchar_t, wchat_t数组},{char,char*,char数组},{std::string,std::wstring},CString之间的相互转换
- C++ wstring string char* wchar_t相互转换
- 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换 [转]
- c++中char*\wchar_t*\string\wstring之间的相互转换
- 深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换