分类: C/C++
2009-06-28 17:16:24
SYMBIAN中的字符串根据存储来分,可以分为两大类,8位和16位字符串。如果只处理,英文,数字什么的当然8位就够了。可是在中国,肯定不可避免的要处理中文。在SYMBIAN系统里,中文或者其他各种复杂的文字都必须使用UNICODE来处理,每个字用2个字节进行存储,因此就产生了16位的字符串。一般我们都直接处理16位字符串。
即使是16位的字符串,又分为TDes16,TDesC16,TBuf16,TBufC16,HBufC16等等一堆,常常让你看着无从入手。其实不考虑他们各自的实现,我们可以这样理解:TDes为虚基类,然后TBuf和HBuf都是由TDes派生。当然这只是为了理解方便,具体SYMBIAN底层到底是如何实现的,我们就不在此讨论了。
TDes:
我们将TDes理解成一个字符串的虚基类,SYMBIAN接口中用到字符串的API,基本都是用TDes或者TDesC的引用作为参数。有没有‘C’的差别其实就是“const”,TDesC是const字符串。TDes是无法直接创建的,只能通过其它字符串类型获得,因此我们将其理解为虚基类。
TBuf:
TBuf类是一个模板类,模板参数要求是该字符串的最大长度。该字符串类是分配在内存栈上的,因此不建议分配过大的字符串,防止栈溢出或分配失败,而且一般作为临时字符串变量来使用,建议使用后就尽快释放。同理,TBuf和TBufC的差别也只是“const”的差别。
HBufC:
HBufC虽然也有一个‘C’,但是它并非const的意思,不知道设计SYMBIAN的人员为何起这么一个容易让人误解的名字。开头用‘H’字母,应该很清楚的说明了,该字符串是从内存堆(Heap)分配而来的。因此,这个字符串必须用new操作来分配,而不能直接生成实例。
另外,HBuC字符串创建的时候,不能用普通的new操作,而必须使用HBucfC类自己的static成员——New、NewL或NewLC。了解SYMBIAN机制的同学,应该都知道,SYMBIAN的很多类都必须使用自己的NEW操作来创建,而不能直接使用C++的new操作符,具体的原因我们就不在这里解释了。创建的时候,同样需要指定该字符串的最大长度。
TPtr:
说了那么多,那么对于字符串的操作怎么办呢?也许你们已经发现了,无论是HBufC还是TBuf,他们都只提供了一些普通的赋值和字符串操作,至于更复杂一些的字符串操作就没有了。那我们要做字符串链接,比较,删除,插入,替换等等各种操作又该如何做呢,是否直接获得字符串底层的内存指针,自己实现?
记住,不到万不得已,千万不要直接获得字符串类底层的内存指针直接更改。SYMBIAN的字符串类中除了存储字符串的内容外,还定义了字符串的其他各种属性,如果你直接对内存操作的话,其它字符串属性得不到更新,会导致输出错误。
为了解决字符串的各种操作处理,SYMBIAN为我们提供了TPtr类。从命名我们很容易理解,这是一个指针类。通过该指针类,提供了一系列的字符串操作接口,基本上能满足大家对字符串处理的各种要求。
那么如何转换成TPtr类呢。对于TBuf类,本是就是直接从TPtr派生的,我们可以直接将其赋值给TPtr实例,以使用TPtr接口。而对于HBufC类,则提供了一个Des接口,直接返回TPtr实例。
如何将8位字符串转换成16位?
我们写程序的时候为了方便,经常把字符串直接写到程序里,比如一个文件目录什么的。这样获得的字符串都是8位的,而为了字符串操作,常常需要将其转换为16位字符串,那怎么办呢?其实也很简单,16位的字符串一般都可以接受8位字符串的赋值。我们可能会这样实现:
char str_dir[] = {"c:\dir\test\test.dat"}
TBuf8<128> str_dir8;
str_dir8.Copy( (uint8*)str_dir );
TBuf16<128> str_dir16;
str_dir16.Copy( str_dir8 );
OK。这样我们便获得了16位的字符串。