C++数据类型转换汇总

 

    在Visual C++.NET2005中,默认的字符集形式是Unicode,但在VC6.0等工程中,默认的字符集形式是多字节字符集(MBCS:Multi- Byte Character Set),这样导致在VC6.0中非常简单实用的各类字符操作和函数在VS2005环境下运行时会报各种各样的错误,这里总结了在Visual C++.NET2005环境中Unicode字符集下CString和char *之间相互转换的几种方法,其实也就是Unicode字符集与MBCS字符集转换。

1、Unicode下CString转换为char *

方法一:使用API:WideCharToMultiByte 进 行转换           

           CString str = _T("D://校内项目//QQ.bmp");

            //注意:以下n和len的值大小不同,n是按字符计算的,len是按字节计算的
              int n = str.GetLength();     // n = 14, len = 18

             //获取宽字节字符的大小,大小是按字节计算的
             int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);

             //为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大小
            char * pFileName = new char[len+1];   //以字节为单位

            //宽字节编码转换成多字节编码
            WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);

             pFileName[len+1] = '/0';    //多字节字符以'/0'结束

方法二:使用函数:T2A、W2A            

 CString str = _T("D://校内项目//QQ.bmp");

 //声明标识符
 USES_CONVERSION;

 //调用函数,T2A和W2A均支持ATL和MFC中的字符转
 char * pFileName = T2A(str);    
 //char * pFileName = W2A(str); //也可实现转换

    注意:有时候可能还需要添加引用#include  

其他示例:

struct TPkgHeader 
{
	DWORD seq;
	int body_len;
};

struct TPkgBody 
{
	char name[30];
	short age;
	char desc[1];
};

{

    static DWORD SEQ = 0;

	USES_CONVERSION;

	CString strContent;
	m_Content.GetWindowText(strContent);

	LPCSTR name = "Gavin";
	LPCSTR desc = T2A((LPCTSTR)strContent);
	int desc_len = (int)strlen(desc) + 1;
	int body_len = offsetof(TPkgBody, desc) + desc_len;

	TPkgBody* pBody = (TPkgBody*)_alloca(body_len);
	memset(pBody, 0, body_len);

	pBody->age = 23;
	strcpy(pBody->name, name);
	strcpy(pBody->desc, desc);

	TPkgHeader header;
	header.seq = ++SEQ;
	header.body_len = body_len;

	WSABUF bufs[2];
	bufs[0].len = sizeof(TPkgHeader);
	bufs[0].buf = (char*)&header;
	bufs[1].len = body_len;
	bufs[1].buf = (char*)pBody;

}

 

 

2、Unicode下char *转换为CString

方法一:使用API:MultiByteToWideChar 进 行转换              

             char * pFileName = "D://校内项目//QQ.bmp";

             //计算char *数组大小,以字节为单位,一个汉字占两个字节
             int charLen = strlen(pFileName);

             //计算多字节字符的大小,按字符计算。
             int len = MultiByteToWideChar(CP_ACP,0,pFileName,charLen,NULL,0);

              //为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小
             TCHAR *buf = new TCHAR[len + 1];

               //多字节编码转换成宽字节编码
              MultiByteToWideChar(CP_ACP,0,pFileName,charLen,buf,len);

             buf[len] = '/0'; //添加字符串结尾,注意不是len+1

              //将TCHAR数组转换为CString
              CString pWideChar;
              pWideChar.Append(buf);

              //删除缓冲区
             delete []buf;

方法二:使用函数:A2T、A2W              

             char * pFileName = "D://校内项目//QQ.bmp";

              USES_CONVERSION;
              CString s = A2T(pFileName);

             //CString s = A2W(pFileName);

方法三:使用_T宏 ,将字符串转换为宽字符           

//多字节字符集,在vc6和vc7种可以编译通过的语句,但VS2005不能通过,默认为Unicode字符集
//AfxMessageBox("加载数据失败",0);

//书写代码使用TEXT("")或_T(""),文本在UNICODE和非UNICODE程序里都通用
AfxMessageBox(_T("加载数据失败"),0);   

       注意:直接转换在基于MBCS的工程可以,但在基于Unicode字符集的工程中直接转换是不可行的,CString会以Unicode的形式来保存数 据,强制类型转换只会返回第一个字符。

 

(1) char*转换成CString

  若将char*转换成CString,除了直接赋值外,还可使用CString::Format进行。例如:

char chArray[] = "This is a test";  
char * p = "This is a test";   

  或

LPSTR p = "This is a test"; 

或在已定义Unicode应的用程序中

TCHAR * p = _T("This is a test");  

 或

LPTSTR p = _T("This is a test");  
CString theString = chArray;  
theString.Format(_T("%s"), chArray);  
theString = p;   

 

(2) CString转换成char*

  若将CString类转换成char*(LPSTR)类型,常常使用下列三种方法:

  方法一,使用强制转换。例如:

CString theString( "This is a test" );  
LPTSTR lpsz =(LPTSTR)(LPCTSTR)theString;   

  方法二,使用strcpy。例如:

CString theString( "This is a test" );  
LPTSTR lpsz = new TCHAR[theString.GetLength()+1];  
_tcscpy(lpsz, theString);   

  需要说明的是,strcpy(或可移值Unicode/MBCS的_tcscpy)的第二个参数是 const wchar_t* (Unicode)或const char* (ANSI),系统编译器将会自动对其进行转换。

  方法三,使用CString::GetBuffer。例如:

CString s(_T("This is a test "));  
LPTSTR p = s.GetBuffer();   
// 在这里添加使用p的代码  
if(p != NULL) *p = _T('/0');  
s.ReleaseBuffer();   
// 使用完后及时释放,以便能使用其它的CString成员函数   

 

(3) BSTR转换成char*

  方法一,使用ConvertBSTRToString。例如:

#include   
#pragma comment(lib, "comsupp.lib")  
int _tmain(int argc, _TCHAR* argv[])
{  

    BSTR bstrText = ::SysAllocString(L"Test");  
    char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);  
    SysFreeString(bstrText); // 用完释放  
    delete[] lpszText2;  
    return 0; 
 
} 

 

  方法二,使用_bstr_t的赋值运算符重载。例如:

_bstr_t b = bstrText;  
char* lpszText2 = b;  

 

(4) char*转换成BSTR

  方法一,使用SysAllocString等API函数。例如:

BSTR bstrText = ::SysAllocString(L"Test");  
BSTR bstrText = ::SysAllocStringLen(L"Test",4);  
BSTR bstrText = ::SysAllocStringByteLen("Test",4);   

 

  方法二,使用COleVariant或_variant_t。例如:

//COleVariant strVar("This is a test");  
_variant_t strVar("This is a test");  
BSTR bstrText = strVar.bstrVal; 

 

  方法三,使用_bstr_t,这是一种最简单的方法。例如:

BSTR bstrText = _bstr_t("This is a test");   

  方法四,使用CComBSTR。例如:

BSTR bstrText = CComBSTR("This is a test");   

  或

CComBSTR bstr("This is a test");  
BSTR bstrText = bstr.m_str;   

 

  方法五,使用ConvertStringToBSTR。例如:

char* lpszText = "Test";  
BSTR bstrText = _com_util::ConvertStringToBSTR(lpszText);   

 

(5) CString转换成BSTR

  通常是通过使用CStringT::AllocSysString来实现。例如:

CString str("This is a test");  
BSTR bstrText = str.AllocSysString();  
…  
SysFreeString(bstrText); // 用完释放  

 

(6) BSTR转换成CString

  一般可按下列方法进行:

BSTR bstrText = ::SysAllocString(L"Test");  
CStringA str;  
str.Empty();  
str = bstrText;   
CStringA str(bstrText);  

 

(7) ANSI、Unicode和宽字符之间的转换

  方法一,使用MultiByteToWideChar将ANSI字符转换成Unicode字符,使用WideCharToMultiByte将Unicode字符转换成ANSI字符。

  方法二,使用“_T”将ANSI转换成“一般”类型字符串,使用“L”将ANSI转换成Unicode,而在托管C++环境中还可使用S将ANSI字符串转换成String*对象。例如:

TCHAR tstr[] = _T("this is a test");  
wchar_t wszStr[] = L"This is a test";  
String* str = S”This is a test”;   

 

  方法三,使用ATL 7.0的转换宏和类。ATL7.0在原有3.0基础上完善和增加了许多字符串转换宏以及提供相应的类,它具有如图3所示的统一形式:

  其中,第一个C表示“类”,以便于ATL 3.0宏相区别,第二个C表示常量,2表示“to”,EX表示要开辟一定大小的缓冲。SourceType和DestinationType可以是A、 T、W和OLE,其含义分别是ANSI、Unicode、“一般”类型和OLE字符串。例如,CA2CT就是将ANSI转换成一般类型的字符串常量。下面是一些示例代码:

LPTSTR tstr= CA2TEX<16>("this is a test");  
LPCTSTR tcstr= CA2CT("this is a test");  
wchar_t wszStr[] = L"This is a test";  
char* chstr = CW2A(wszStr);   

 

 

 

更多参见这里

你可能感兴趣的:(C++)