WCHAR,CHAR,TCHAR的区别

2010-03-29 12:35

WCHAR,CHAR,TCHAR的区别

现在C++的字符分成两种类型wchar_t和char。  
其中   WCHAR==wchar_t,CHAR==char。  
TCHAR是一种条件编译的类型,根据条件可以代表wchar_t或char。  

CHAR实施上就是unsigned char,
WCHAR为宽字符,
而TCHAR根据是否支持unicode而不同。
在程序使用sizeof(TCAHR),当默认设置时,这个值是1;
当定义UNICODE宏时,这个值是2。

BSTR是BASICA中的字符串在C++中的表示方法,它是一种带有字符计数的wchar_t类型的字符串,SysAllocString,   SysFreeString这两个函数是Windows中专门处理BSTR的函数(属于COM函数)。  
   
各种类型之间是可以进行强制转换的(有些有专有的函数比如wchar_t和char的相互转换)

/

WCHAR,CHAR,TCHAR的关系实际上是这样的  
   
#ifdef   UNICODE    
          typedef   wchar_t   TCHAR;    
#else    
          typedef   unsigned   char   TCHAR;    
#endif    
     
typedef   unsigned   char   CHAR;    
typedef   unsigned   wchar_t   WCHAR;    
   
//wchar_t   16-bit   predefined   type   for   wide   characters.   Unsigned    
   
A   BSTR,   known   as   basic   string   or   binary   string,   is   a   pointer   to   a   wide   character   string   used   by   Automation   data   manipulation   functions.  
   
typedef   OLECHAR   FAR*   BSTR;  
     
BSTRs   are   wide,   double-byte   (Unicode)   strings   on   32-bit   Windows   platforms   and   narrow,   single-byte   strings   on   the   Apple®   PowerMac™.  
   
因而不能直接进行强制转换,系统提供了一些宏进行转换如OLE2T,T2OLE。  
另外   BSTR   并在   COM   对象之间传递它们时,必须小心地处理它们所使用的内存以避免内存泄漏。当   BSTR   停留在接口中时,在完成其使用后必须释放出它的内存。但是,如果   BSTR   传递出了接口,那么接收对象将负责它的内存管理。管理的函数就诸如SysAllocString,   SysFreeString。BSTR是一个比较复杂的数据类型,系统有许多关于他的操作和封装对象,应该看一些有关方面的书。其他的问题请提的具体些,并且多给一点分。

//

1.char* to wchar*
WCHAR* ToWChar(char * str)

{
static WCHAR buffer[1024];

wcsset(buffer,0);

MultiByteToWideChar(CP_ACP,0,str,strlen(str),buffer,1024);

return buffer;

}
2 wchar* to char*
(1)use WideCharToMultiByte

uchar wszSomeString[1024];

char szANSIString [MAX_PATH];

WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );

(2)use W2A:

USES_CONVERSION;

pTemp=W2A(wszSomeString);     
    
   
///

1. char * --> UNICODE WCHAR *
CComBSTR bstr(str);

2. UNICODE WCHAR*到 char *
CString str(wchar*);


char 8 字节 :
char *p = "hello";
char p[] = "hello";
宽字符
typedef unsigned short wchar_t;  
wchar_t 16 字节;
wchar_t c = 'A';
wchar_t Cw = L"hello";   14 字节 --->最后还有一个0;
L : 告诉编译器,按宽字符保存;strlen(const char*)     //用于计算单字符的长度
wcslen(const wchar_t*); //用于计算宽字符的长度。
strlen(p);          如果两个混用将出现错误;            
wcslen(cw);          ---〉== 6;(自动去掉末尾的0)
还有一些函数:
wprintf, ----printf
wsprintf, ----sprintf
wvsprintf ----vsprintf


获取长度:

LPCTSTR strTmp : lstrlen( LPCTSTR lpString );
char *strTmp : strlen( const char *string );
_bstr_t strTmp : wcslen( const wchar_t *string );  

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值