在windows编程中,由于编码方式的不同和c与c++的不同而造成了许多复杂的有关字符串之间的转换
首先,windows编码方式有ANSCLL和UNICODE,前者是单字符的,后者是双字符的。
然后,char*理所当然是单字符的,string也是单字符的,而CString是Tchar的。
那么什么是TCHAR呢,它在采用ANSCLL的编码中表示单字符,在UNICODE编码中表示双字符,定义如下
如果定义_UNICODE,声明如下: typedef wchar_t TCHAR;
如果没有定义_UNICODE,则声明如下: typedef char TCHAR;
而我们可以采用宏来告诉编译器来以什么编码方式来保存字符常量
_T一般同字常数相关,如_T("Hello"。如果你编译一个 程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T 和_L的区别在于,_L不管你是以什么方式编译,一律UNICODE方式保存.
而根据字符串类型的命名我们也很容易看出LPTSTR、LPCTSTR是Tchar类型的字符串指针LPSTR,LPCSTR是char*的字符串指针,LPWSTR,LPCWSTR是UNIcode编码的字符串指针。
你可以使用Microsoft在ATL里面提供的宏来进行转换
#include <atlbase.h>
USES_CONVERSION;
LPCWSTR pw = T2W("Hello,world!"); // tchar -> wchar
LPCTSTR pt = W2T(L"Hello,world!"); // wchar -> tchar
等等.而LPTSTR与LPSTR是可以进行强制类型转换的,好像在CStrng中定义了这种强制类型转换。这样这三种类型就能相互转换了。
string向char*转换的方式是char*=string.c_str(),
char*向string转换直接赋值就行,应该是隐式的调用了string的构造函数。
string转 CString
CString.format(”%s”, string.c_str());
CString转 string
string s(CString.GetBuffer());
GetBuffer()后一定要ReleaseBuffer(),否则就没有释放缓冲区所占的空间.
CString转char *
CString cstr;
char *p =(LPSTR)(LPCTSTR)cstr;
char转 CString
CString.format(”%s”, char*);