Delphi 字符串类型浅析_delphi字符串比较

2020-02-27 其他范文 下载本文

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

出处明:

《Delphi 字符串类型浅析.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
Delphi 字符串类型浅析
点击下载文档
相关专题 delphi字符串比较 字符串 类型 Delphi delphi字符串比较 字符串 类型 Delphi
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文