关于windows编程里的各种奇形怪状的String和转换

那么多  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  (自己猜~)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值