那么多 CString、CStringA、CStringW、LPCTSTR、LPTSTR、LPSTR、LPCSTR、WCHAR、TCHAR、string、wchar_t、char、char*、char[] ,看得人头疼
简单总结一下作参考,不是绝对正确的哦
一.编码
ASCII 占一个字节(8位) 也就会窄字节
Unicode 占两个字节(16位) 也就是宽字节
ANSI编码 在中文系统里即 GB2312编码 也是占两个字节(16位) ?
我用的是VS2008 ,对项目-属性-字符集配置可以有三种
“未设置”(即ANSI编码) ,
“unicode” (Unicode编码),
“多字节”
二. char,wchar_t ,L宏
char :单字节变量类型,最多表示256个字符,
wchar_t :宽字节变量类型,用于表示Unicode字符,
它实际定义在<string.h>里:typedef unsigned short wchar_t。
为了让编译器识别Unicode字符串,必须以在前面加一个“L”,定义宽字节类型方法如下:
wchar_t c = `A’ ;
wchar_t * p = L”Hello!” ;
wchar_t a[] = L”Hello!” ;
其中,宽字节类型每个变量占用2个字节,故上述数组a的sizeof(a) = 14
(此段摘自 http://www.cnblogs.com/wanghao111/archive/2009/05/25/1488816.html )
三. CString , char*, string 之间的转化
在vs2008项目-属性-字符集设置为”多字节”的情况下
以变量CString cstring1, std::string string1, char* char1 为例
1.CString 转 String,char*
string1 = CString1; //CString 转 String
char1 = cstring1.GetBuffer(); //CString 转 char*
cstring1.ReleaseBuffer();
2.String 转 CString ,char*
cstring1 = string1.data(); //String 转 CString
new char[string1.length()+1]; //String 转 char*
strcpy( char1,string1.data() );
3.char* 转 CString, String
cstring1 = char1; // char* 转 CString,
string1 = char1; //char* 转 String
一般把项目字符集设置为unicode,省掉一些不必要的繁琐,所以
在vs2008项目属性字符集设置为unicode(宽字符集)的情况下
上面的三个转换做一些改动
1.string使用 std::wstring 类型
2.char*使用 WCHAR* 类型
3.定义字符串时使用L宏
4.spycpy() 改为使用 wcscpy()
如下:
CString cstring1 = L”test”;
std::string string1 = L”test”;
char* char1 = L”test”;
new WCHAR[string1.length()+1]; //String 转 char*
wcscpy( char1,string1.data() );
上面的代码区分了多字符,宽字节,但是编写时要做属性的切换比较麻烦,所以
使用_T宏可以让编译器自动识别宽字节还是多字节
和上面相比,作如下改动:
1.把上面的L宏 改为 _T()
2.不用WCHAR,而用TCHAR
3.依然使用std::string, 不必用std::wstring
4.依然使用spycpy(), 不必用wcscpy()
VS2008项目属性有Mutil-Byte和Unicode两种,Cstring中的字符采用TCHAT编码,而TCHAR在Unicode下是char 8位表示已个字符。在Mutil中是WCHAR即16位表示一个字节。
所有在Mutil-Byte中 char *p=(LPCTSTR)CString就正确。
四. LP系列:
LPWSTR =( lp表示long pointer指针, w表示wchar_t)
LPCWSTR =(和lpwstr相比,多了一个c,即const常量)
LPCSTR (lp表示long pointer指针, C表示const常量)
LPCWSTR (自己猜~)