wstring与string的转换

目录

wchar*wstringchar*std::string 的相互转换

字符串是基本内容,必须要掌握。

string 实质上是 char 字符的字符串。

typedef basic_string<char, char_traits<char>, allocator<char> > string;  

wstring 实质上是 wchar_t 字符的字符串,即所谓的宽字符。

typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;

同类型字符相互转换

string 字符串和 char 字符数组可以直接相互转换。

// char* -> string  
char ch[] = "风中飞舞";  
string str1(ch);  
// string -> const char*  
const char* pch = str1.c_str();  

如果想转换到非常量形式 char*,可以用 strcpy() 拷贝到新串,或用 const_cast<> 运算去掉常量性。 同理,wstringwchar_t 数组的转换图上面相同,只不过拷贝串要用 wstrcpy() 函数。

不同类型字符相互转换

charwchar_t 的转换有好几种,标准 C++ 用流函数 os.widen()os.narrow() 可以转换单个字符。

下面用 Windows API 实现 unicode(一般情况下 wchar_t 使用的编码)和 ansi(char使用的编码)的相互转换:

#include <windows.h>  
#include <string> 

// wchar_t* -> string  
std::string wchar2string(const wchar_t* pwchar)  
{  
    int nLen = WideCharToMultiByte(CP_ACP, 0, pwchar, -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, pwchar, -1, pszDst, nLen, NULL, NULL); 
    pszDst[nLen -1] = 0; 
    std::string strTemp(pszDst); 
    delete [] pszDst; 
    return strTemp; 
} 

// wstring -> string  
std::string wstring2string(const std::wstring & wstr)
{  
    return wchar2string(wstr.c_str());
}

// char* -> wstring
std::wstring char2wstring( const char* pchar , int nLen)  
{
    int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pchar, nLen, 0, 0);  
    if(nSize <= 0) 
        return NULL; 
    WCHAR *pwszDst = new WCHAR[nSize+1]; 
    if( NULL == pwszDst) 
        return NULL; 
    MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pchar, nLen, pwszDst, nSize); 
    pwszDst[nSize] = 0; 
    if( pwszDst[0] == 0xFEFF) // skip Oxfeff 
        for(int i = 0; i < nSize; i ++) 
            pwszDst[i] = pwszDst[i+1]; 
    
    std::wstring wcharString(pwszDst);
    delete pwszDst;
    
    return wcharString;
} 
    
// string -> wstring  
std::wstring string2wstring( const std::string & str )  
{  
    return char2wstring(str.c_str(), str.size());  
}

// char* -> wchar*  
wchar_t* char2wchar( const char* pchar , int nLen)  
{  
    int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pchar, nLen, 0, 0);  
    if(nSize <= 0) 
        return NULL; 
    WCHAR *pwszDst = new WCHAR[nSize+1]; 
    if( NULL == pwszDst) 
        return NULL; 
        
    MultiByteToWideChar(CP_ACP, 0,(LPCSTR)pchar, nLen, pwszDst, nSize); 
    pwszDst[nSize] = 0; return pwszDst; 
} 

// wchar* -> char*
char* wchar2char( const wchar_t* pwchar )  
{  
    int nLen = WideCharToMultiByte(CP_ACP, 0, pwchar, -1, NULL, 0, NULL, NULL);  
    if (nLen<= 0) 
        return 0; 
    char* pszDst = new char[nLen]; 
    if (NULL == pszDst) 
        return 0; 
    WideCharToMultiByte(CP_ACP, 0, pwchar, -1, pszDst, nLen, NULL, NULL); 
    pszDst[nLen -1] = 0; 
    return pszDst; 
} 

以上的代码中有重复,应该进一步修改。