Delphi-字符串类型浅析.doc
文本预览下载声明
Delphi 字符串类型浅析 收藏
参考资料《Delphi 5开发人员指南》“第2章Object Pascal语言”
《PASCAL精要》“第7章 字符串操作”
“Delphi中String类型和Char类型的比较”
“Object Pascal中String类型的内幕探讨”
基本知识字符串类型
?AnsiString这是Pascal缺省的字符串类型,它由AnsiChar字符组成,其长度没有限制,同时与null结束的字符串相兼容。
?ShortString保留该类型是为了向后兼容Delphi1.0,它的长度限制在255个字符内。
?WideString功能上类似于AnsiString,但它是由WideChar字符(UniCode字符集)组成的。引入这种类型,主要是为了支持OLE编程。
?PChar指向null结束的Char字符串的指针,类似于C的char*或lpstr类型。
?PAnsiChar指向null结束的AnsiChar字符串的指针。
?PWideChar指向null结束的WideChar字符串的指针。
字符类型
?AnsiChar,以 8 位表示 (共有 256 个不同的符号)。
?WideChar,以 16 位表示 (共有 64,000 个不同的符号)。
String类型
注意:以下是指Delphi2007以前的编译器(包括Delphi2007)。
1、缺省情况下,如果用如下的代码来定义字符串,编译器认为是AnsiString字符串:
var
S:string;//编译器认为S的类型是AnsiString
2、编译开关$H
“$H编译开关”的值用来决定当变量声明为string时,它是被当作AnsiString类型还是被当作ShortString类型。当“$H”值为负时,string变量是ShortString类型;当“$H”值为正时(缺省情况),string变量是AnsiString类型。下面的代码演示了这种情况:
var
{$H-}
S1:string;//S1是ShortString类型
{$H+}
S2:string;//S2是AnsiString类型
使用$H规则的一个例外是,如果在定义时特地指定了长度(最大在255个字符内),那么总是ShortString。
var
S:string[63];//63个字符的ShortString字符串
Char类型
1、Delphi2007以前的编译器(包括Delphi2007)缺省情况下认为Char是AnsiChar类型,PChar是PAnsiChar类型。
2、Delphi2009的编译器缺省情况下认为Char是WideChar类型,PChar是PWideChar类型。
请注意,没有任何方法可变更这个新的编译器预设设定。对于字符串类型而言,会以固定的硬式编码方式将 Char 类型对应到特定的数据类型。
AnsiString类型
1、AnsiString是生存期自管理类型。
2、AnsiString字符串总是以null字符结束的,这使得AnsiString字符串能与Win32API中的字符串兼容。
3、AnsiString类型是一个指向在堆栈中的字符串结构的指针。
可以使用Sizeof去读取AnsiString类型的大小,不论字符串的实际长度是多少,Sizeof(AString)永远是4。
4、AnsiString字符串在内存中分配的情况
注意:
在Delphi2.0以后版本中,不能再通过字符串的第0个元素来设置或得到字符串的长度,只能通过Length()函数来得到字符串的长度,通过SetLength()过程来设置字符串的长度。
Borland并不保证String的内存结构在以后的Delphi版本中会保持不变。
(1)、Delphi5内存结构如下:
(2)、Delphi7内存结构如下:
AnsiString指向一块内存起始偏移8字节处,前面8字节依次为引用计数和长度计数两个整数。
(3)、Delphi2009内存结构如下:
-12
-10
-8
-4
最后一位
字码页
字符大小
引用计数
字串长度
字串内容
0
除了字串长度及引用计数外,新的AnsiString格式包括字符大小及字码页。字符大小可用来区分 AnsiString 及UnicodeString,而字码页特别适用于 AnsiString 类型 (可用于 Delphi 2009),UnicodeString 类型的字码页则固定为 1200,字码包括UTF-8、GBK等,例如“$03A8就是936,查MSDN 936 - gb2312”。
5、AnsiString字符串的引用计数机制。
(1)、AnsiString字符串基于引用计数机制,通过引用计
显示全部