CString与PLCWSTR,PLSTR,
CHAR 存放单个字符
WCHAR 存放双字符
TCHAR 与WCHAR无异
PTCHAR 指向双字符类型字符串
LPSTR 一个32位的指向字符串的指针
LPCSTR 一个32位的指向字符串常量的指针
LPWSTR 一个32位的指向unicode字符串的指针
LPCWSTR 一个32位的指向unicode字符串常量的指针
PSTR 指向字符串的指针,poionter string
注:
很多变量前加lpsz,lpsz的各个字母的含义:
L 是long
p 是pointer
sz是 以/0结束的字符串
_T与_L的区别就是 _L不管你用那种方式编译,一律用unicode方式编码
_T是个适配宏,如果定义了_UNICODE时,_T与L相同,否则_T用ANSI方式编码
CString转换成LPCWSTR
// 方法一:
CString strFileName;
LPCWSTR lpcwStr = strFileName.AllocSysString();
//方法二:
CString str=_T("TestStr");
USES_CONVERSION;
LPCWSTR lpcwStr = A2CW((LPCSTR)str);
CString 转换为LPSTR
// 方法1:
CString strFileName;
LPSTR lpstr = strFileName.GetBuffer();
strFileName.Releasebuffer();
// 方法2:
CString strFileName;
LPSTR lpstr = (LPSTR)(LPCSTR)strFileName;
LPSTR转化为CString
LPSTR lpstr = _T("TestStr");
CString str(lpstr);
** 注意:CString和LPCSTR可直接转换,如下: **
CString str;
LPCSTR lpcStr = (LPCSTR)str;
CString和char*转换
CString转换成char*
//方法一:
CString str;
char* p = str.GetBuffer();
//方法二:
CString str;
char* p = (LPSTR)(LPCSTR)str;
char*转换成CString
char* p = "test";
CString str = ("%s",p);
String和int、float的转换
可以使用atoi,atof,atol等函数来完成。
LPSTR(char*)和LPWSTR的转换
VS2005中CString已经改为宽字符型,一些转换如下:
char name[10];
TCHAR sex[5] ;
char *p = name;
TCHAR *pw = sex;
LPSTR lpstr = name;
LPCSTR lpcstr = name;
lpcstr = lpstr;
lpstr = p;
p = (char*)sex;
pw = (WCHAR*)name;
LPWSTR lpwstr = (LPWSTR)lpstr;
lpwstr = (LPWSTR)lpcstr;
LPCWSTR lpcwstr = (LPCWSTR)lpstr;
lpcwstr = (LPCWSTR)name;
CString str(lpstr);
CString str1(lpcstr);
CString str2(lpwstr);
CString str3(lpcwstr);
CString str4(name);
CString str5(sex);
lpwstr = (LPWSTR)(LPCWSTR)str;
lpstr = (LPSTR)(LPCWSTR)str;
lpcstr = (LPCSTR)(LPCWSTR)str;
p = (char*)str.GetBuffer();
pw = str.GetBuffer();
可以看出转换更加简单了,基本上可以直接转换,A2W等宏基本上不需要啦
可以使用下面的ATL宏来进行,最好是将变量定义成TCHAR、LPTSTR等T类型,可以避免转换。
ATL宏介绍:
A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2T OLE2T T2OLE W2OLE
A2W OLE2W T2W W2T
A :ANSI 字符串,也就是 MBCS。
W、OLE 宽字符串,也就是 UNICODE。
T 中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示A
C const 的缩写
利用这些宏,可以快速的进行各种字符间的转换。使用前必须包含头文件,并且申明USER_CONVERSION;使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:
1、只适合于进行短字符串的转换;
2、不要试图在一个次数比较多的循环体内进行转换;
3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;
4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();
void Func1(LPSTR lpStr);
void Func2(LPWSTR lpwStr);
TCHAR name[256];
TCHAR* pName = new TCHAR[256];
Func1(name); // Func1(pName);
Func2(name); // Func2(pName);
注意在VS2005中上面用红色标记的代码已经不成立。