[DELPHI]字符/字符串学习(一)
以下内容引用"dephi5开发人员指南":
字符:用来代表单个字符的类型,Delphi有三种类型的字符:
AnsiChar:标准的1字节的ANSI字符
WideChar:2字节的Unicode字符
Char:相当于WideChar,但在Delphi以后版本中相当于WideChar.
注:一个字符在长度上并不代表是一个字节,所以不能程序中对字符长度进行硬编码,而应该使用Sizeof函数。
字符串:
字符串是代表一组字符的变量类型,每一种语言都有自己的字符串类型的存储和使用方法。
Pascal类型有下列几种不同的字符串类型来满足程序的要求:
AnsiString:这是Pascal缺省的字符串类型,它由AnsiCahr字符组成,其长度没有限制,与null结束的字符串相容
特点:
1:动态分配的并有自动回收功能
2:总是以null字符结束
3:复制字符串因为仅仅是复制了指针而不是复制实际的字符串而变得非常快
4:Delphi内存管理使用了Copy-on-write技术,一个字符串要等到修改结束,才释放一个引用并分配一个物理字符串
5:第一次声明AnsiString时,它是没有长度的,因此在字符串中就没有为字符分配空间。为了对字符
串分配空间,用一行字母或另一个字符串对它进行赋值,或者用SetLength()过程
6:能像数组一样对字符串进行索引
7:Sizeof返回值是定义的长度加1,因为定长字符串会多出一个首字节来记忆字符串的实际长度。
ShortString:向后兼容,长度是255的字符
WideString:功能上类似于AnsiString,但它是由WideChar字符组成
WideString和AnsiString的不同主要在三个方面
1:WideString由WideChar字符组成,而不是由AnsiChar字符组成的,它们跟Unicode字符串兼容
2:WideString用SysAllocStrLen() API函数进行分配,它们跟OLE的BSTR字符串相兼容
3:WideString没有引用计数,所以将一个WideString字符串赋值给另一个WideString字符串时,就
需要从内存中的一个位置复制到另一个位置。这使得 WideString在速度和内存的利用上不如AnsiString有效
PChar:指向null结束的Char字符串的指针,类似于C的char * 或l p s t r类型。
特点:与AnsiString和WideString类型不同,PChar的内存不是由Object Pascal自动产生和管理的,要用Object Pascal的内存管理函数来为
PChar所指向的内存进行分配。 PChar字符串的理论最大长度是4GB
内存分配函数 内存释放函数
AllocMem() FreeMem()
GlobalAlloc() GlobalFree()
GetMem() FreeMem()
New() Dispose()
StrAlloc() StrDispose()
StrNew() StrDispose()
VirtualAlloc() VirtualFree()
PAnsiChar:指向null结束的AnsiChar字符串的指针。
PWideChar:指向null结束的WideChar字符串的指针。
/*---------------------------------------------------------------------------------------------*/
D2009以上:Char-->WideChar String-->UnicodeString
D2009以下:Char-->Char String-->AnsiString
{------------------------------------------------------------------------------------------------------------------------------------------}
{*简单的说,在D2010中有3中字符串类型:
AnsiString:主要用来表示MBCS编码的ANSI字符串以及UTF-8字符串;
UnicodeString:(string为其别名),用来表示UTF-16编码的Unicode字符串;
WideString:用来表示UTF-16编码的Unicode字符串,和COM兼容;
其中,UnicodeString和WideString的区别在于,前者支持引用计数,而后者不支持,但兼容OLESTR。*}