有关字符串类型总结

先char*   是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。

LP的含义是长指针(long   pointer)。LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。

为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。

LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。

然后为了实现两种编码的通用,提出了TCHAR的定义:
如果定义_UNICODE,声明如下:
typedef   wchar_t   TCHAR;
如果没有定义_UNICODE,则声明如下:
typedef   char   TCHAR;

LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。

CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。

如果您还需要进一步的信息,请参看http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_data_type_mappings.asp等其他有关信息。

int   i   =   100;
long   l   =   2001;
float   f=300.2;
double   d=12345.119;
char   username[]="女侠程佩君";
char   temp[200];
char   *buf;
CString   str;
_variant_t   v1;
_bstr_t   v2;

一、其它数据类型转换为字符串

短整型(int)
itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制
itoa(i,temp,2);   ///按二进制方式转换  
长整型(long)
ltoa(l,temp,10);


二、从其它包含字符串的变量中获取指向该字符串的指针


CString变量
str   =   "你好csdn";
buf   =   (LPSTR)(LPCTSTR)str;  
BSTR类型的_variant_t变量
v1   =   (_bstr_t)"程序员";
buf   =   _com_util::ConvertBSTRToString((_bstr_t)v1);

三、字符串转换为其它数据类型
strcpy(temp,"123");  

短整型(int)
i   =   atoi(temp);  
长整型(long)
l   =   atol(temp);  
浮点(double)
d   =   atof(temp);

四、其它数据类型转换到CString
使用CString的成员函数Format来转换,例如:

整数(int)
str.Format("%d",i);  
浮点数(float)
str.Format("%f",i);  
字符串指针(char   *)等已经被CString构造函数支持的数据类型可以直接赋值
str   =   username;

五、BSTR、_bstr_t与CComBSTR

CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。
char   *转换到BSTR可以这样:   BSTR   b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h
反之可以使用char   *p=_com_util::ConvertBSTRToString(b);

六、VARIANT   、_variant_t   与   COleVariant
VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。
对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子:
VARIANT   va;
int   a=2001;
va.vt=VT_I4;///指明整型数据
va.lVal=a;   ///赋值

对于不马上赋值的VARIANT,最好先用Void   VariantInit(VARIANTARG   FAR*   pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:

unsigned   char   bVal;   VT_UI1  
short   iVal;   VT_I2  
long   lVal;     VT_I4    
float   fltVal;     VT_R4  
double   dblVal;     VT_R8    
VARIANT_BOOL   boolVal;     VT_BOOL  
SCODE   scode;     VT_ERROR  
CY   cyVal;     VT_CY  
DATE   date;     VT_DATE  
BSTR   bstrVal;     VT_BSTR  
IUnknown   FAR*   punkVal;     VT_UNKNOWN  
IDispatch   FAR*   pdispVal;     VT_DISPATCH  
SAFEARRAY   FAR*   parray;     VT_ARRAY|*  
unsigned   char   FAR*   pbVal;     VT_BYREF|VT_UI1  
short   FAR*   piVal;     VT_BYREF|VT_I2  
long   FAR*   plVal;     VT_BYREF|VT_I4  
float   FAR*   pfltVal;     VT_BYREF|VT_R4  
double   FAR*   pdblVal;   VT_BYREF|VT_R8  
VARIANT_BOOL   FAR*   pboolVal;   VT_BYREF|VT_BOOL  
SCODE   FAR*   pscode;     VT_BYREF|VT_ERROR  
CY   FAR*   pcyVal;     VT_BYREF|VT_CY  
DATE   FAR*   pdate;   VT_BYREF|VT_DATE  
BSTR   FAR*   pbstrVal;     VT_BYREF|VT_BSTR  
IUnknown   FAR*   FAR*   ppunkVal;     VT_BYREF|VT_UNKNOWN  
IDispatch   FAR*   FAR*   ppdispVal;   VT_BYREF|VT_DISPATCH  
SAFEARRAY   FAR*   FAR*   pparray;     VT_ARRAY|*  
VARIANT   FAR*   pvarVal;     VT_BYREF|VT_VARIANT  
void   FAR*   byref;     VT_BYREF  

_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。
例如:
long   l=222;
ing   i=100;
_variant_t   lVal(l);
lVal   =   (long)i;

COleVariant的使用与_variant_t的方法基本一样,请参考如下例子:
COleVariant   v3   =   "字符串",   v4   =   (long)1999;
CString   str   =(BSTR)v3.pbstrVal;
long   i   =   v4.lVal;

七、其它

对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如:
LPARAM   lParam;
WORD   loValue   =   LOWORD(lParam);///取低16位
WORD   hiValue   =   HIWORD(lParam);///取高16位  
对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如:
WORD   wValue;
BYTE   loValue   =   LOBYTE(wValue);///取低8位
BYTE   hiValue   =   HIBYTE(wValue);///取高8位

八.单字节与多字节的相互转化

1、Unicode下CString转换为char *

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

              CString str = _T("d://hellocsdn.txt");

            //注意:以下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   <afxpriv.h>

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的形式来保存数据,强制类型转换只会返回第一个字符。

提示:WideCharToMultiByte,MultiByteToWideChar的第一个参数的取值列表为下:
CP_ACP:ANSI字符集;CP_MACCP:Macintosh代码页;CP_OEMCP:OEM代码页;

  CP_SYMBOL:符号字符集(42);CP_THREAD_ACP:当前线程ANSI代码页;

  CP_UTF7:使用UTF-7转换;CP_UTF8:使用UTF-8转换。

  dwFlags:一组未标记用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符。你可以指定下面是标记常量的组合,含义如下:

  MB_PRECOMPOSED:通常使用预作字符——就是说,由一个基本字符和一个非空字符组成的字符只有一个单一的字符值。这是缺省的转换选择。不能与

  MB_COMPOSITE值一起使用。

  MB_COMPOSITE:通常使用组合字符——就是说,由一个基本字符和一个非空字符组成的字符分别有不同的字符值。不能与MB_PRECOMPOSED值一起使用。

  MB_ERR_INVALID_CHARS:如果函数遇到无效的输入字符,它将运行失败,且GetLastErro返回ERROR_NO_UNICODE_TRANSLATION值。

  MB_USEGLYPHCHARS:使用象形文字替代控制字符。

  组合字符由一个基础字符和一个非空字符构成,每一个都有不同的字符值。每个预作字符都有单一的字符值给基础/非空字符的组成。在字符è中,e就是基础字符,而重音符标记就是非空字符。

  函数的缺省动作是转换成预作的形式。如果预作的形式不存在,函数将尝试转换成组合形式。

  标记MB_PRECOMPOSED和MB_COMPOSITE是互斥的,而标记MB_USEGLYPHCHARS和MB_ERR_INVALID_CHARS则不管其它标记如何都可以设置。

  lpMultiByteStr:指向将被转换字符串的字符。

  cchMultiByte:指定由参数lpMultiByteStr指向的字符串中字节的个数。如果lpMultiByteStr指定的字符串以空字符终止,可以设置为-1(如果字符串不是以空字符中止,设置为-1可能失败,可能成功),此参数设置为0函数将失败。

  lpWideCharStr:指向接收被转换字符串的缓冲区

  cchWideChar:指定由参数lpWideCharStr指向的缓冲区的字节数。若此值为零,函数返回缓冲区所必需的宽字符数,在这种情况下,lpWideCharStr中的缓冲区不被使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值