字符串类型(Delphi)

来自RAD Studio
跳转到:航行,搜索

转到数据类型、变量和常量索引


本主题描述Delphi语言中可用的字符串数据类型。包括以下类型:

关于字符串类型

字符串表示字符序列。Delphi支持以下预定义的字符串类型。

字符串类型

类型 最大长度 需要内存 用于

短字符串

255个字符

2到256字节

向后兼容性。

AnsiString公司

~2^31个字符

4字节到2GB

8位(ANSI)字符、DBCS ANSI、MBCS ANSI和Unicode字符等。

Unicode字符串

注:在RAD Studio中,一串是UnicodeString的别名。

~2^30个字符

4字节到2GB

Unicode字符、8位(ANSI)字符、多用户服务器和多语言应用程序

UnicodeString是默认的字符串类型。

宽字符串

~2^30个字符

4字节到2GB

Unicode字符;多用户服务器和多语言应用程序。适用于移动平台的Delphi编译器不支持WideString,但适用于桌面平台的Delfi编译器支持它。使用Unicode字符串优先于WideString。

注:默认字符串类型为UnicodeString。提供WideString是为了与COM兼容BSTR公司类型。您通常应该使用Unicode字符串用于非COM应用程序。大多数情况下Unicode字符串是首选类型。类型一串是的别名Unicode字符串.

字符串类型可以在赋值和表达式中混合使用;编译器会自动执行所需的转换。但通过引用传递给函数或过程的字符串(作为无功功率,无功功率外面的参数)必须是适当的类型。字符串可以显式转换为不同的字符串类型。然而,将多字节字符串转换为单字节字符串可能会导致数据丢失。

有一些特殊的字符串类型值得一提:

键入mystring=键入AnsiString(CODEPAGE)
它是一个AnsiString公司其具有在特定代码页中维护其内部数据的亲和力。
  • 这个原始字节字符串类型为类型AnsiString($FFFF).原始字节字符串允许传递任何代码页的字符串数据,而无需执行任何代码页转换。原始字节字符串只能用作常数或值类型参数或函数的返回类型。它永远不应该通过引用传递(通过无功功率,无功功率),并且永远不应该作为变量实例化。
  • UTF8字符串表示使用UTF-8(Unicode可变字节数)编码的字符串。这是一个代码页面AnsiString公司使用UTF-8代码页键入。

保留字一串功能类似于通用字符串类型标识符。例如:

var S:字符串;

创建变量S公司包含字符串的。在Win32平台上,编译器解释一串(当它后面没有带括号的数字时)作为Unicode字符串.

在Win32平台上,您可以使用{$H-}转向指令一串进入之内短字符串。在当前程序中使用旧的16位Delphi代码或Turbo Pascal代码时,这是一种潜在的有用技术。

请注意,关键字一串声明时也使用短字符串特定长度的类型(请参见短字符串,见下文)。

字符串的比较是通过元素在相应位置的顺序来定义的。在长度不等的字符串之间,长字符串中的每个字符的值都大于短字符串中的相应字符。例如,“AB”大于“A”;也就是说,“AB”>“A”返回真的零长度字符串表示最小值。

您可以像索引数组一样索引字符串变量。如果S公司是非-Unicode字符串字符串变量和,整数表达式,S[i]公司代表第i个字节输入S公司,可能不是第i个字符或多字节字符串(MBCS)的整个字符。类似地,索引Unicode字符串变量产生的元素可能不是整个字符。如果字符串包含基本多语言平面(BMP)中的字符,则所有字符都是2个字节,因此对字符串进行索引将获得字符。但是,如果BMP中没有某些字符,则索引元素可能是代理项对,而不是整个字符。

标准功能长度返回字符串中的元素数。如上所述,元素数不一定是字符数。这个设置长度过程调整字符串的长度。请注意大小Of函数返回用于表示变量或类型的字节数。请注意大小Of返回字符串中的字符数仅适用于短字符串.大小Of返回所有其他字符串类型的指针中的字节数,因为它们是指针。

对于短字符串或AnsiString公司,S[i]公司类型为安西查尔。对于宽字符串,S[i]公司类型为宽字元。对于单字节(西方)区域设置,MyString[2]:=“A”;分配值A类第二个字符我的字符串。以下代码使用标准UpCase(大写)要转换的函数我的字符串大写:

var I:整数;开始I:=长度(MyString);当我>0时开始MyString[I]:=大写(MyString[1]);I:=I-1;结束;结束;

以这种方式为字符串编制索引时要小心,因为覆盖字符串的末尾可能会导致访问冲突。此外,避免将字符串索引作为无功功率,无功功率参数,因为这会导致代码效率低下。

您可以将字符串常量的值或任何其他返回字符串的表达式的值赋给变量。进行赋值时,字符串的长度会动态更改。示例:

MyString:='你好,世界!';MyString:=“Hello”+“world”;MyString:=MyString+'!';MyString:=“”;{空格}MyString:=“”;{空字符串}

短字符串

A类短字符串长度为0到255个单字节字符。短字符串可以动态更改,其内存是静态分配的256字节;第一个字节存储字符串的长度,其余255个字节可用于字符。如果S公司是一个短字符串变量,订单(S[0]),比如长度(S),返回长度S公司; 为指定值S[0],比如打电话设置长度,更改长度S公司.短字符串仅为向后兼容而维护。

Delphi语言支持短字符串类型,实际上是短字符串-其最大长度为0到255个字符。这些由括号中的数字附加到保留字表示一串例如:

var MyString:字符串[100];

创建一个名为我的字符串,最大长度为100个字符。这相当于声明:

类型CString=字符串[100];var MyString:CString;

以这种方式声明的变量只分配类型所需的内存,即指定的最大长度加上一个字节。在我们的示例中,我的字符串使用101个字节,而预定义变量使用256个字节短字符串类型。

将值赋给短字符串变量时,如果字符串超过该类型的最大长度,则该字符串将被截断。

标准功能操作短字符串类型标识符和变量。返回短字符串类型的最大长度,而返回零。

AnsiString公司

AnsiString公司表示动态分配的字符串,其最大长度仅受可用内存的限制。

AnsiString公司变量是包含字符串信息的结构。当变量为空时,也就是说,当它包含一个长度为零的字符串时,指针为并且该字符串不使用额外的存储。当变量非空时,它指向包含字符串值的动态分配内存块。这个内存是在堆上分配的,但它的管理是完全自动的,不需要用户代码。这个AnsiString公司结构包含32位长度指示器、32位引用计数、指示每个字符字节数的16位数据长度和16位代码页。

AnsiString公司表示单字节字符串。对于单字节字符集(SBCS),字符串中的每个字节表示一个字符。在多字节字符集(MBCS)中,元素仍然是单字节,但某些字符由一个字节表示,其他字符由多个字节表示。多字节字符集,尤其是双字节字符集(DBCS),广泛用于亚洲语言。AnsiString公司可以包含MBCS字符。

的索引AnsiString公司基于1。索引多字节字符串不可靠,因为S[i]公司代表第i个字节(不一定是第i个字符)中S公司. The第i个字节可以是单个字符或字符的一部分。然而,标准Ansi字符串字符串处理函数具有支持多字节的对等函数,它们还实现了字符的特定于本地的排序。(多字节函数的名称通常以安西-。例如,多字节版本的StrPos公司AnsiStrPos公司.)多字节字符支持依赖于操作系统并基于当前区域设置。

因为AnsiString公司变量有指针,其中两个或多个可以引用相同的值,而不消耗额外的内存。编译器利用这一点来节省资源并更快地执行赋值。每当AnsiString公司变量被销毁或分配了新值,旧值的引用计数AnsiString公司(变量的前一个值)递减,新值的参考计数(如果有)递增;如果字符串的引用计数为零,则释放其内存。这个过程称为引用计数。当索引用于更改字符串中单个字符的值时,如果(但仅当)字符串的引用计数大于1,则会生成该字符串的副本。这被称为copy-on-write语义。

UnicodeString(默认字符串类型)

这个Unicode字符串type是默认的字符串类型,表示动态分配的Unicode字符串,其最大长度仅受可用内存的限制。

在Unicode字符集中,每个字符由一个或多个字节表示。Unicode有几个Unicode转换格式使用不同但等效的字符编码,可以很容易地相互转换。

  • 例如,在UTF-8中,字符可能是1到4个字节。在UTF-8中,前128个Unicode字符映射到US-ASCII字符。
  • UTF-16是另一种常用的Unicode编码,其中字符为2字节或4字节。世界上大多数角色都在基本多语言平面可以用2个字节表示。其余字符需要两个2字节字符,称为代理对.
  • UTF-32用4个字节表示每个字符。

Win32平台支持单字节和多字节字符集以及Unicode。Windows操作系统支持UTF-16。

请参阅Unicode标准了解更多信息。

这个Unicode字符串类型的结构与AnsiString公司类型。Unicode字符串数据以UTF-16进行编码。

Unicode字符串AnsiString公司具有相同的结构,它们的功能非常相似。Unicode字符串变量为空,它不使用额外的内存。当它不为空时,它指向一个动态分配的内存块,其中包含字符串值,对此的内存处理对用户是透明的。Unicode字符串变量是引用计数的,其中两个或多个变量可以引用相同的值,而不消耗额外的内存。

的实例Unicode字符串可以索引字符。索引是基于1的,就像AnsiString公司.

Unicode字符串赋值与所有其他字符串类型兼容。然而AnsiString公司Unicode字符串进行适当的向上或向下转换。请注意,分配Unicode字符串键入到AnsiString公司不建议使用类型,否则可能会导致数据丢失。

Delphi还可以通过宽字元,PWideChar格式、和宽字符串类型。

有关使用Unicode的更多信息,请参阅RAD Studio中的Unicode为Unicode启用应用程序.

宽字符串

这个宽字符串类型表示动态分配的16位Unicode字符字符串。在某些方面它类似于AnsiString公司。在Win32上,宽字符串与COM兼容BSTR公司类型。

宽字符串适用于COM应用程序。然而,宽字符串未计算引用,因此Unicode字符串在其他类型的应用程序中更加灵活高效。

的索引宽字符串多字节字符串不可靠,因为S[i]公司代表第i个元素(不一定是第i个字符)S公司.

对于德尔福,字符字符数组类型为宽字元PWideChar格式类型。

注: 宽字符串用于移动平台的Delphi编译器不支持,但用于桌面平台的Delfi编译器使用。

使用以null结尾的字符串

许多编程语言,包括C和C++,都缺少专用的字符串数据类型。这些语言以及使用它们构建的环境依赖于以null结尾的字符串。以null结尾的字符串是以NUL(#0)结尾的基于零的字符数组;因为数组没有长度指示符,所以第一个NUL字符标记字符串的末尾。您可以在系统实用程序单位(参见标准例程和输入输出)当您需要与使用空终止字符串的系统共享数据时,可以处理这些字符串。

例如,可以使用以下类型声明存储以null结尾的字符串:

类型TIdentifier=Char的数组[0..15];TFileName=Char的数组[0..259];TMemoText=WideChar的数组[0..1023];

使用扩展语法已启用({$X+}),可以将字符串常量分配给静态分配的基于零的字符数组。(动态数组不适用于此目的。)如果使用比数组声明长度短的字符串初始化数组常量,则其余字符设置为#0.

使用指针、数组和字符串常量

要操作以null结尾的字符串,通常需要使用指针。(请参见指针和指针类型(Delphi).)字符串常量与赋值兼容字符数组PWide字符类型,表示指向以null结尾的数组的指针字符宽字元值。例如:

变量P:PChar;。。。P:=“你好,世界!”

P(P)到包含原始常量字符串“Hello world!”的内存区域这相当于:

const TempString:Char的数组[0..12]=“Hello world!”;变量P:PChar;。。。P:=@TempString[0];

您还可以将字符串常量传递给任何接受值或常数类型的参数字符数组PWideChar格式-例如StrUpper(“你好,世界!”)。与分配给字符数组,编译器生成字符串的一个以null结尾的副本,并给函数一个指向该副本的指针。最后,您可以初始化字符数组PWide字符单独或在结构化类型中包含字符串文本的常量。示例:

常数消息:PChar=“程序终止”;提示:PChar='输入值:';数字:PChar数组[0..9]=(“零”、“一”、“二”、“三”、“四”、“五”、,“六”、“七”、“八”、“九”);

基于零的字符数组与兼容字符数组PWide字符。当使用字符数组代替指针值时,编译器会将数组转换为指针常量,该常量的值对应于数组第一个元素的地址。例如:

无功功率,无功功率MyArray:Char的数组[0..32];MyPointer:PChar;开始MyArray:=“你好”;MyPointer:=MyArray;SomeProcedure(MyArray);SomeProcedure(MyPointer);结束;

此代码调用某些程序两次使用相同的值。

字符指针可以像数组一样进行索引。在前面的示例中,我的指针[0]收益H(H)。索引指定在取消引用指针之前添加到指针的偏移量。(适用于PWideChar格式变量,索引将自动乘以2。)因此,如果P(P)是字符指针,第[0]页等于P(P)^并指定数组中的第一个字符,第[1]页指定数组中的第二个字符,依此类推;P[-1]指定紧邻左侧的“字符”第[0]页。编译器不对这些索引执行范围检查。

这个Str上部函数说明如何使用指针索引遍历以null结尾的字符串:

函数StrUpper(Dest,Source:PChar;MaxLen:整数):PChar;无功功率,无功功率一: 整数;开始I:=0;而(I<MaxLen)和(源[I]<>#0)则会开始Dest[I]:=大写(源[I]);公司(I);结束;目标[I]:=#0;结果:=目的地;结束;

混合使用Delphi字符串和以Null结尾的字符串

你可以混合字符串(AnsiString公司Unicode字符串值)和以null结尾的字符串(字符数组值),您可以传递字符数组值设置为接受字符串参数的函数或过程。任务S:=P,其中S公司是字符串变量,并且P(P)是一个字符数组表达式,将以null结尾的字符串复制到字符串中。

在二进制运算中,如果一个操作数是字符串,而另一个是字符数组,的字符数组操作数转换为Unicode字符串.

你可以投一个字符数组值作为Unicode字符串。当您想对两个字符数组值。例如:

S:=字符串(P1)+字符串(P2);

您还可以使用Unicode字符串AnsiString公司字符串作为以null结尾的字符串。适用以下规则:

  • 如果S公司是一个Unicode字符串,PChar(S)铸件S公司作为以null结尾的字符串;它返回指向中第一个字符的指针S公司。此类强制转换用于Windows API。例如,如果战略1Str2公司Unicode字符串,您可以调用Win32 API对话框功能如下:
    消息框(0,PChar(Str1),PChar(Str2),MB_OK);
使用PAnsiChar公司(S)如果S公司是一个AnsiString公司.
  • 您还可以使用指针(S)将字符串强制转换为非类型指针。但如果S公司为空,typecast返回.
  • PChar(S)始终返回指向内存块的指针;如果S公司为空,指针指向#0返回。
  • 当你投下一个Unicode字符串AnsiString公司变量指向指针时,指针将保持有效,直到为变量赋值或超出范围。如果将任何其他字符串表达式强制转换为指针,则该指针仅在执行类型转换的语句中有效。
  • 当你投Unicode字符串AnsiString公司表达式指向指针时,该指针通常应被视为只读。只有在满足以下所有条件时,才能安全地使用指针修改字符串:
    • 表达式转换是Unicode字符串AnsiString公司变量。
    • 字符串不为空。
    • 该字符串是唯一的,即引用计数为1。要确保字符串是唯一的,请调用设置长度,设置字符串,或唯一字符串程序。
    • 自进行类型转换以来,字符串未被修改。
    • 修改的字符都在字符串中。注意不要在指针上使用超出范围的索引。

混合时适用相同的规则宽字符串具有的值PWideChar格式值。

长字符串和多行字符串文字

从RAD Studio 12.0开始,字符串文字现在可以超过255个字符;换句话说,字符串文字不再局限于经典的Pascal ShortString类型。

该语言增加了对多行字符串的支持。多行字符串由一个三引号(“”)和一个新行引入,可以派生源代码的多行,并以一个右三引号('')结尾。例如:

常数strML1=“”棕色狐狸快速跳跃为了那只懒狗。“”;strHTML=“”<UL><LI>第1项<LI>第2项<LI>第3项<LI>第4项</UL>''';strJSON=“”[{“id”:“1”,“name”:“Large”},{“id”:“2”,“name”:“Medium”},{“id”:“2”,“name”:“Small”}]''';strSQL=“”选择*来自客户WHERE部门=“研发”按名称订购;''';

多行字符串缩进和格式化逻辑的使用非常具体。多行字符串按以下方式处理前导空格:

  • 结束的“”必须位于它自己的一行中,而不是字符串本身最后一行的末尾。
  • 结束“”的缩进决定了整个字符串的基本缩进。
  • 在每一行的最后一个字符串中,该缩进级别之前的每个空格都将被删除。
  • 所有行的缩进都不能小于基准缩进(闭合的“”)。这是一个编译器错误,也显示为error Insight。
  • 省略了结尾“”之前的最后一行换行符。如果你想有最后一个新行,你应该在末尾添加一个空行。
注:当将外部应用程序中的多行文本粘贴到RAD Studio编辑器中时,可能会有特殊的不可见字符、控制字符、特定换行组合和不常见的Unicode字符,这些字符可能会使编辑器感到困惑。
注:请注意,三重引号(“')也可以替换为大量奇数引号,如5或7。这允许在多行字符串中嵌入实际的三引号。例如:
 无功功率,无功功率  := '''''
  一些 文本
   现在 '''
  一些 更多 文本
  ''''';

另请参见