Visual C++.NET中的字符串转换方法

分类: VC.NET   出处:iocblog整理  更新时间:2008-11-30   添加到收藏  

  visual c++.net涉及到atl/atl server、mfc和托管c++等多种编程方式,不仅功能强大而且应用广泛。在编程中,我们常常会遇到ansi、unicode以及bstr不同编码类型的字符串转换操作。本文先介绍基本字符串类型,然后说明相关的类,如ccombstr、_bstr_t、cstringt等,最后讨论它们的转换方法,其中还包括使用最新atl7.0的转换类和宏,如ca2ct、ca2tex等。

  一、bstr、lpstr和lpwstr

  在visual c++.net的所有编程方式中,我们常常要用到这样的一些基本字符串类型,如bstr、lpstr和lpwstr等。之所以出现类似上述的这些数据类型,是因为不同编程语言之间的数据交换以及对ansi、unicode和多字节字符集(mbcs)的支持。

  那么什么是bstr、lpstr以及lpwstr呢?

  bstr(basic string,basic字符串)是一个olechar*类型的unicode字符串。它被描述成一个与自动化相兼容的类型。由于操作系统提供相应的 api函数(如sysallocstring)来管理它以及一些默认的调度代码,因此bstr实际上就是一个com字符串,但它却在自动化技术以外的多种场合下得到广泛使用。图1描述了bstr的结构,其中dword值是字符串中实际所占用的字节数,且它的值是字符串中unicode字符的两倍。

  lpstr和lpwstr是win32和vc++所使用的一种字符串数据类型。lpstr被定义成是一个指向以null(‘’)结尾的8 位ansi字符数组指针,而lpwstr是一个指向以null结尾的16位双字节字符数组指针。在vc++中,还有类似的字符串类型,如lptstr、 lpctstr等,它们的含义如图2所示。

  例如,lpctstr是指“long pointer to a constant generic string”,表示“一个指向一般字符串常量的长指针类型”,与c/c++的const char*相映射,而lptstr映射为 char*。

  一般地,还有下列类型定义:

#ifdef unicode
 typedef lpwstr lptstr;
 typedef lpcwstr lpctstr;
#else
 typedef lpstr lptstr;
 typedef lpcstr lpctstr;
#endif

  二、cstring、cstringa 和 cstringw

  visual c++.net中将cstringt作为atl和mfc的共享的“一般”字符串类,它有cstring、cstringa和cstringw三种形式,分别操作不同字符类型的字符串。这些字符类型是tchar、char和wchar_t。tchar在unicode平台中等同于wchar(16位 unicode字符),在ansi中等价于char。wchar_t通常定义为unsigned short。由于cstring在mfc应用程序中经常用到,这里不再重复。

  三、variant、colevariant 和_variant_t

  在ole、activex和com中,variant数据类型提供了一种非常有效的机制,由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来看看oaidl.h文件中variant定义的一个简化版:

struct tagvariant {
 vartype vt;
 union {
  short ival; // vt_i2.
  long lval; // vt_i4.
  float fltval; // vt_r4.
  double dblval; // vt_r8.
  date date; // vt_date.
  bstr bstrval; // vt_bstr.
  …
  short * pival; // vt_byref|vt_i2.
  long * plval; // vt_byref|vt_i4.
  float * pfltval; // vt_byref|vt_r4.
  double * pdblval; // vt_byref|vt_r8.
  date * pdate; // vt_byref|vt_date.
  bstr * pbstrval; // vt_byref|vt_bstr.
 };
}; 

[1] [2] [3] [4] 下一页


Tag: 字符转换



文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。