Symbian 中的字符串

来源:互联网 发布:lol域名可以建站 编辑:程序博客网 时间:2024/04/30 14:48
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实例。
原创粉丝点击