当前位置: 首页 > 工具软件 > Free Pascal > 使用案例 >

Free Pascal 学习笔记 第五章 字符类型 Character Types

姚丰羽
2023-12-01

 

.Char类型

一个字符一个字节,包含一个ASCII字符。

Char类型通过将字符括在单引号中来指定字符常量,如’a’ ‘A’

.WideChar

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兼容性而定义。

.单字节字符串类型 Single-byte String types

https://www.freepascal.org/docs-html/ref/refsu9.html

Free Pascal里的string

  1. 一个可选长度的字符序列。长度由[]里的数字指定,格式:string[无符号整数]

  2. 也支持delphi里的anistrings(具有无限长度)和代码页信息。

  3. {$H}开关控制长度或代码页

var 
	A:String;
	A:String;

//该示例没有指定长度和代码页,A可能是AnsiString也可能是Short String

//注意,包含ansistring和短字符串的表达式的结果将始终是ansistring。

Wrtieln(StringCodePage(A));

//显示字符串A的代码页

4.1 Short String

以下情况会声明为一个Short String

  1. {$H -},则字符串声明将始终是短字符串声明。

  2. {$H+} 加上一个最大长度(大小)说明符,则该声明为短字符串声明。

  3. 使用系统代码页。预定义的类型ShortString被定义为大小为255的字符串

Short string = string[255]

  1. 如果未指定字符串的大小,则默认为255。字符串的实际长度可以使用Length标准运行时例程获取。 {$H-}
    Type
    NameString = String[10]; //最多可以包含10个字符
    StreetString = String; //最多可以包含255个字符

  2. 短字符串,长度存储在索引为0的字符中

注意:可移植的代码,请使用SetLength设置短字符串的长度,使用Length来检索它。无论使用哪种短字符串或其他字符串的内部表示形式,这些函数将始终起作用:这允许在各种字符串类型之间轻松切换。

4.2 Ansistring

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);

4.3 RawByteString

1.RawByteString类型是不带代码页信息(CP_NONE)的AnsiString字符串类型

2.系统和Sysutils单元中的大多数单字节字符串都使用RawByteString类型。

Var:

RawByteString = Type Ansistring(CP_NONE)

4.4 UTF8 字符串

单字节代码页字符串只能存储该代码页中可用的字符,代码页中不存在的字符不能用该字符串表示。

UTF-8中的ASCII字符映射到CP_ACP编码

Var:

UTF8String = Type AnsiString(CP_UTF8)

4.5代码页转换

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

五. 多字节字符串类型 Multi-byte String types

5.1 UnicodeString

与AnsiString类似:引用计数,以null结束的数组

Const  

  ws2: unicodestring = ’phi omega : ’#$03A8’ ’#$03A9; 

5.2 WideString

1.WideString的类型(用来表示在COM应用程序的unicode字符串)与UnidecodeString几乎相同。如果不需要与COM交互,则应使用UnicodeString类型。

2.在Windows系统上,WideString类型不进行引用计数,并且使用特殊的Windows函数进行分配,该函数允许将它们用于OLE自动化。这意味着它们被实现为WideChars的空终止数组,而不是常规Chars。

.常量字符串 Constant string

单引号括起来

常量字符串是存储为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 : Null terminated strings

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字符串中 的功能。

stralloc

在堆上为新的以null终止的字符串分配内存

strcat

连接2个以null终止的字符串。

strcomp

比较2个以空值结尾的字符串,区分大小写。

strcopy

复制以空值结尾的字符串

strdispose

在堆上处理以null终止的字符串

strecopy

复制以空值结尾的字符串,并返回一个指向末尾的指针。

strend

返回一个以空字符结尾的字符串的末尾的指针

stricomp

比较2个以空值结尾的字符串,不区分大小写。

stripos

返回字符串中子字符串的位置,不区分大小写。

striscan

扫描字符串中的字符,不区分大小写

Strlcat

连接2个以长度为边界的以null终止的字符串。

strlcomp

比较2个以零结尾的字符串的有限字符数

strlcopy

复制一个以空值结尾的字符串,该字符串的长度受到限制。

strlen

空终止字符串的长度。

strlicomp

比较2个以空值结尾的字符串中有限数量的字符,忽略大小写。

strlower

将以null终止的字符串转换为全小写。

strmove

将以空值结尾的字符串移动到新位置。

strnew

为新的以null终止的字符串分配空间。

strpas

将以null终止的字符串转换为shortstring。

strpcopy

将Pascal字符串复制到以空值结尾的字符串

strpos

在以零结尾的字符串中搜索以零结尾的子字符串

strriscan

反向扫描字符串以查找不区分大小写的字符

strrscan

查找以空字符结尾的字符串中字符的最后一次出现。

strscan

查找以空字符结尾的字符串中字符的首次出现。

strupper

将以null终止的字符串转换为全部大写

3.6PChar指针算法

操作

结果

P+I

将I添加到P指向的地址中。

I+P

将I添加到P指向的地址中。

P-I

减去我从地址通过指向P。

P-Q

以整数形式返回两个地址之间的距离

(或P和Q之间的字符数)

8.字符串大小 String sizes

字符串占用的内存取决于字符串类型。一些字符串类型在堆的内存中分配字符串数据,另一些字符串类型在堆栈中分配字符串数据。

表3.7总结了各种字符串类型的各种字符串类型的内存使用情况。在表中,使用以下符号常量:

  1. L是字符串的实际长度。

  2. HS取决于Free Pascal的版本,但从Free Pascal 2.7.1开始为16字节。

  3. 对于所有版本的Free Pascal,UHS大小均为8字节。

  4. 在Windows上,所有版本的Free Pascal的WHS大小均为4字节。在所有其他平台上,WHS等于UHS,因为WideString类型等于UnicodeString类型。


 

3.7字符串内存大小

字符串类型

堆栈大小

堆大小

Shortstring

声明的长度+ 1

0

Ansistring

指针大小

L +1 + HS

Widestring

指针大小

2 *(L +1)+ WHS

UnicodeString

指针大小

2 *(L +1)+ UHS

PChar

指针大小

L + 1


 

 类似资料: