string和wstring相互转换

简介: //第一种方法:调用WideCharToMultiByte()和MultiByteToWideChar(),代码如下(关于详细的解释,可以参考《windows核心编程》):  #include...
//第一种方法:调用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  = 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;  
}  
目录
相关文章
|
7月前
|
存储 算法 C语言
【C++】对于string的补充(成员函数c_str()、大小写转换、字符串和实数之间的相互转换)
【C++】对于string的补充(成员函数c_str()、大小写转换、字符串和实数之间的相互转换)
36 0
|
8月前
|
Go
golang 中string和int类型相互转换
golang 中string和int类型相互转换
80 0
|
8月前
|
Java
Java StringBuilder 和 String 相互转换
Java StringBuilder 和 String 相互转换
59 0
wstring和string的转化
wstring和string的转化
79 0
|
Java 编译器 Scala
值类型与 String 相互转换|学习笔记
快速学习值类型与 String 相互转换。
61 0
值类型与 String 相互转换|学习笔记
【C++】string和int类型相互转换
【C++】string和int类型相互转换
【C++】string和int类型相互转换
|
Java
Java中包装类、int和String类型相互转换、自动拆箱和自动装箱及字符串数据排序案例
包装类、int和String类型相互转换、自动拆箱和自动装箱及字符串数据排序案例的简单示例
122 0
Java中包装类、int和String类型相互转换、自动拆箱和自动装箱及字符串数据排序案例
StringBuffer类的使用以及与String类的相互转换
StringBuffer类的使用以及与String类的相互转换
C++学习——CString,char * ,string的相互转换
C++学习——CString,char * ,string的相互转换
206 0
|
Go
go语言-string和int类型相互转换
go语言-string和int类型相互转换
245 0