Delphi 字符串类型浅析_delphi字符串比较
Delphi 字符串类型浅析由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“delphi字符串比较”。
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 936sizeof(StrRec));
showmeage(Format('分配大小:%d 引用计数:%d 字串长度:%d', [P.allocSiz,P.refCnt,P.length]));end;
示例:delphi7字符串内存结构
代码:
procedure TForm1.Button1Click(Sender: TObject);type
PStrRec = ^StrRec;
StrRec = packed record
refCnt: Longint;
length: Longint;
end;var
str: string;
P: PStrRec;
begin
str:='123';
P := Pointer(Integer(str)sizeof(StrRec));
showmeage(Format('字码页:%d 字符大小:%d 引用计数:%d [P.codePage,P.elemSize,P.refCnt,P.length]));end;
示例:widestring的长度
代码:
字串长度:%d', procedure TForm1.Button1Click(Sender: TObject);
//---
function _WStrLen1(const S: WideString): Integer;
begin
if Pointer(S)= nil then
Result := 0
else
Result := PInteger(Integer(S)-4)^ div sizeof(WideChar);
end;var
str: widestring;
begin
str := '测试123';
showmeage(Format('字串长度:%d', [_WStrLen1(str)]));end;
本文来自CSDN博客,转载请标http://blog.csdn.net/starsky2006/archive/2010/07/31/5778729.aspx
出处明: