一个字符一个字节,包含一个ASCII字符。
Char类型通过将字符括在单引号中来指定字符常量,如’a’ ‘A’
2个字节大小。
包含UTF-16编码的Unicode字符,在UTF-16编码前加#实现。
希腊字符示例
Const
C3 : widechar = #$03A8;
C4 : widechar = #$03A9;
可以通过将单词强制转换为widechar来实现相同的目的
Const
C3 : widechar = widechar($03A8);
C4 : widechar = widechar($03A9);
Const
C3 : widechar = #$03A8;
C4 : widechar = #$03A9;
可以通过将单词强制转换为widechar来实现相同的目的
Const
C3 : widechar = widechar($03A8);
C4 : widechar = widechar($03A9);
Free Pascal在系统单元中定义了其他一些字符类型,例如UCS2Char,UCS4Char,UniCodeChar。但是这些字符类型仅出于Delphi兼容性而定义。
https://www.freepascal.org/docs-html/ref/refsu9.html
Free Pascal里的string
一个可选长度的字符序列。长度由[]里的数字指定,格式:string[无符号整数]
也支持delphi里的anistrings(具有无限长度)和代码页信息。
{$H}开关控制长度或代码页
var
A:String;
A:String;
//该示例没有指定长度和代码页,A可能是AnsiString也可能是Short String
//注意,包含ansistring和短字符串的表达式的结果将始终是ansistring。
Wrtieln(StringCodePage(A));
//显示字符串A的代码页
以下情况会声明为一个Short String
{$H -},则字符串声明将始终是短字符串声明。
{$H+} 加上一个最大长度(大小)说明符,则该声明为短字符串声明。
使用系统代码页。预定义的类型ShortString被定义为大小为255的字符串
Short string = string[255]
如果未指定字符串的大小,则默认为255。字符串的实际长度可以使用Length标准运行时例程获取。 {$H-}
Type
NameString = String[10]; //最多可以包含10个字符
StreetString = String; //最多可以包含255个字符
短字符串,长度存储在索引为0的字符中
注意:可移植的代码,请使用SetLength设置短字符串的长度,使用Length来检索它。无论使用哪种短字符串或其他字符串的内部表示形式,这些函数将始终起作用:这允许在各种字符串类型之间轻松切换。
4.2.1.Ansistring字符串特点
Ansistring是没有长度限制的字符串,引用计数(reference count),以null结束。
ansistring为指针:字符串的实际内容存储在堆中,并分配了存储字符串内容所需的内存。
声明ansistring时,Free Pascal编译器最初仅为指针分配内存,指针为Nil,这意味着最初为空。
4.22. 修改长度大于1的字符串中的某个字符:
s:=’1234567890’;
s[1] := ‘@’;
4.2.3. 获得Ansistring字符串长度:
s:=’1234567890’;
l:= ord(s[0]);
4.2.4 Ansistring可以转换成PChar或Pointer
Var
P:Pointer;
PC:Pchar;
S:Ansistring;
begin
s := ‘This is an ansistring’;
PC := Pchar(s);
P := Pointer(S);
1.RawByteString类型是不带代码页信息(CP_NONE)的AnsiString字符串类型
2.系统和Sysutils单元中的大多数单字节字符串都使用RawByteString类型。
Var:
RawByteString = Type Ansistring(CP_NONE)
单字节代码页字符串只能存储该代码页中可用的字符,代码页中不存在的字符不能用该字符串表示。
UTF-8中的ASCII字符映射到CP_ACP编码
Var:
UTF8String = Type AnsiString(CP_UTF8)
1.短字符串使用系统代码页
2.纯文本字符串使用系统代码页
{$h+}
uses sysutils;
Type
TString1 = Type String(1252);
TString2 = Type String(1251);
Var
A : TString1;
B : TString2;
begin
A:=’123’+’345’+intToStr(123);
B:=A;
Writeln(’B: "’,B,’" : ’,StringRefCount(B),’ -> ’,StringCodePage(B));
Writeln(’A: "’,A,’" : ’,StringRefCount(A),’ -> ’,StringCodePage(A));
end.
结果显示如下:
B: "123345123" : 1 -> 1251
A: "123345123" : 1 -> 1252
结果显示如下:
B: "123345123" : 1 -> 1251
A: "123345123" : 1 -> 1252
与AnsiString类似:引用计数,以null结束的数组
Const
ws2: unicodestring = ’phi omega : ’#$03A8’ ’#$03A9;
1.WideString的类型(用来表示在COM应用程序的unicode字符串)与UnidecodeString几乎相同。如果不需要与COM交互,则应使用UnicodeString类型。
2.在Windows系统上,WideString类型不进行引用计数,并且使用特殊的Windows函数进行分配,该函数允许将它们用于OLE自动化。这意味着它们被实现为WideChars的空终止数组,而不是常规Chars。
单引号括起来
常量字符串是存储为ansistring还是短字符串取决于{$H}开关的设置
#10换行 #13回车
S := 'This is a string.';
S := 'One’ + ’, Two' + ', Three';
S := 'This isn’t difficult!';
S := 'This is a weird character : ’#50’ !';//通常是ASCII码,#50为2
S := 'This is a weird character : ' + #50 + ' !'; //这2种方式都可以?!!!
S := 'This is a string.';
S := 'One’ + ’, Two' + ', Three';
S := 'This isn’t difficult!';
S := 'This is a weird character : ’#50’ !';//通常是ASCII码,#50为2
S := 'This is a weird character : ' + #50 + ' !'; //这2种方式都可以?!!!
PChar被定义为指向Char类型的指针,但允许进行其他操作。
最好将PChar类型理解为C样式的以null终止的字符串的Pascal等效项,即PChar类型的变量是一个指向Char类型的数组的指针,该数组以null字符(#0结束)。
Free Pascal支持PChar的初始化类型常量或直接赋值。
program one;
var P : PChar;
begin
P := ’This is a null-terminated string.’;
ShowMessage (P);
end.
One程序与Two程序结果一样
program two;
const P : PChar = ’This is a null-terminated string.’;
begin
ShowMessage(P);
end.
具有与前两个示例相同的结果。空终止的字符串不能作为普通的Pascal字符串添加。
Program three;
Var S : String[33];//参考中的示例是[30].到底是30还是33?
P : PChar;
begin
S := 'This is a null-terminated string.' + #0;
P := @S[1];
ShowMessage (P);
ShowMessage(s);// 空终止的字符串不能作为普通的Pascal字符串添加。为啥这句可以?!!!
ShowMessage (P);
end.
One程序与Two程序结果一样
program two;
const P : PChar = ’This is a null-terminated string.’;
begin
ShowMessage(P);
end.
具有与前两个示例相同的结果。空终止的字符串不能作为普通的Pascal字符串添加。
Program three;
Var S : String[33];//参考中的示例是[30].到底是30还是33?
P : PChar;
begin
S := 'This is a null-terminated string.' + #0;
P := @S[1];
ShowMessage (P);
ShowMessage(s);// 空终止的字符串不能作为普通的Pascal字符串添加。为啥这句可以?!!!
连接两个PChar字符串;必须使用单位String字符串中 的功能。
在堆上为新的以null终止的字符串分配内存 | |
连接2个以null终止的字符串。 | |
比较2个以空值结尾的字符串,区分大小写。 | |
复制以空值结尾的字符串 | |
在堆上处理以null终止的字符串 | |
复制以空值结尾的字符串,并返回一个指向末尾的指针。 | |
返回一个以空字符结尾的字符串的末尾的指针 | |
比较2个以空值结尾的字符串,不区分大小写。 | |
返回字符串中子字符串的位置,不区分大小写。 | |
扫描字符串中的字符,不区分大小写 | |
连接2个以长度为边界的以null终止的字符串。 | |
比较2个以零结尾的字符串的有限字符数 | |
复制一个以空值结尾的字符串,该字符串的长度受到限制。 | |
空终止字符串的长度。 | |
比较2个以空值结尾的字符串中有限数量的字符,忽略大小写。 | |
将以null终止的字符串转换为全小写。 | |
将以空值结尾的字符串移动到新位置。 | |
为新的以null终止的字符串分配空间。 | |
将以null终止的字符串转换为shortstring。 | |
将Pascal字符串复制到以空值结尾的字符串 | |
在以零结尾的字符串中搜索以零结尾的子字符串 | |
反向扫描字符串以查找不区分大小写的字符 | |
查找以空字符结尾的字符串中字符的最后一次出现。 | |
查找以空字符结尾的字符串中字符的首次出现。 | |
将以null终止的字符串转换为全部大写 |
表3.6:PChar指针算法
操作 | 结果 |
I+P | |
P-I | |
P-Q | 以整数形式返回两个地址之间的距离 |
字符串占用的内存取决于字符串类型。一些字符串类型在堆的内存中分配字符串数据,另一些字符串类型在堆栈中分配字符串数据。
表3.7总结了各种字符串类型的各种字符串类型的内存使用情况。在表中,使用以下符号常量:
表3.7:字符串内存大小
堆大小 | ||
Shortstring | ||
Widestring | ||
PChar | L + 1 |