DelphiXE下的字符串变化

简介: 字符串类型用于描述一个单独的书面的文字和符号。一、字符类型Delphi支持AnsiChar和WideChar两种基本的字符类型。AnsiChar类型变量使用单字节来表示一个字符,WideChar使用两个字节来表示一个字符。

字符串类型用于描述一个单独的书面的文字和符号。

一、字符类型

Delphi支持AnsiChar和WideChar两种基本的字符类型。AnsiChar类型变量使用单字节来表示一个字符,WideChar使用两个字节来表示一个字符。WideChar和AnsiChar类型的变量之间不能相互赋值,例:

Var

   wch: WideChar;

   ach: AnsiChar;

begin

   ach := '国'; //错误。ach占用一个字节,而汉字占用两个字节。但编译器不会提示。

   ach := wch; //错误。编译器会自动提示类型不匹配。

end;

 

Delphi中最常用的字符类型是Char类型。它是上面两种字符类型其中一种的别名。DelphiXE中,Char默认为WideChar,但在之前的版本如Delph7中,Char类型代表AnsiChar。所以在使用时要特别注意。

 

 

 

二、字符串类型

字符串表示由字符组成的序列。Delphi中常用的字符串类型主要有四种:ShortString、AnsiString、WideString、UnicodeString。四种字符串的简要信息如下:

 类型

最大长度 

所需内存 

用途 

 ShortString

 255 byte

 2-256 byte 

容纳AnsiChar 

 AnsiString

 2GB

 4-2GB 

容纳AnsiChar 

 WideString

 2GB

 4-2GB

容纳WideChar

 UnicodeString

 2GB

 4-2GB 

容纳Unicode码字符

 

 

 其中,UniCodeString和WideString基本无区别。Delphi在编程中通常讲字符串声明为String类型,此类型与UnicodeString类型完全等价。在较早的版本中String等价于AnsiString类型。

 

注意:DelphiXE中使用UniCodeString下标引用得到的字符的值,而使用AnsiString下标引用得到的却是字节的值。

1、ShortString

又称为短字符串(相对的其他三种类型称为长字符串),其实质上是一个编译器内置的字符数组,类似下面的代码(但是不等效)

Type

   ShortString = Array[0.255] of AnsiChar;

   其容纳由256个AnsiChar组成的字符串,但第一个字符有特殊用途,所以ShortString类型的字符串长度不能超过255byte。

   ShortString的第一个字节的值等于字符串的实际长度。所以获取ShortString字符串的实际长度有两种:一是利用标准函数Length();二是直接用第一个字节的值。例如:

Var

   str: ShortString;

   str1: Array[0..255] of AnsiChar;

begin

   str := 'abcdefg';

   str1 := 'abcdefg';

 

   ShowMessage(IntToStr(integer(str[0]))); //显示7

   ShowMessage(IntToStr(Length(str))); //显示7

   ShowMessage(IntToStr(SizeOf(str))); //显示256

 

    ShowMessage(str[1]); //显示a

    ShowMessage(str1[0]); //显示a

end;

2、AnsiString

   是Delphi最常用的类型,此类型的字符串由ASCII扩展字符集组成。很显然,这种类型字符串不能用于不同语言版本的操作系统,否则会出现一堆乱码。

   AnsiString实质上是一个指针类型,与普通的指针不同,此类型的指针专用于指向字符串。利用标准函数SizeOf()可知此类型变量在内存中占用4个字节。所以AnsiString最小值为4byte,而非0byte,也就是说,一个空字符串占用4个字节。

   由于AnsiString类型的字符串占用的空间最大可达2GB,为了节约内存,Delphi将AnsiString字符串的本身分配在堆中,而在栈中留下一个指向字符串的指针,这个指针就是AnsiString类型的变量。使用字符串索引时要注意,索引应该从1开始,因为0索引的值标识了这个字符串的长度。对AnsiString类型字符串进行索引只能得到某个字节,而不一定是某个字符的值。如:

Var

   str: AnsiString;

begin

   str := '中国';

   ShowMessage(str[1]);//显示?

end;

str[1]不表示“中”,因为汉字在ASCII扩展字符集中由两个字节组成,所以str[1]只能得到“中”的第一个字节。

 

 

 

相关文章
|
搜索推荐 JavaScript 数据可视化
uniapp/vue个性化单选、复选组件
uniapp/vue个性化单选、复选组件
468 5
|
缓存 Java API
OKHttp详解
OKHttp详解
|
机器人 Android开发 数据安全/隐私保护
Android App 导出APK安装包以及制作App图标讲解及实战(图文解释 简单易懂)
Android App 导出APK安装包以及制作App图标讲解及实战(图文解释 简单易懂)
2913 0
|
编解码 物联网 Linux
Genymotion —— 强大好用高性能的 Android 模拟器
Genymotion 是一款优秀专业高性能的安卓 Android 模拟器!它支持 Windows、Mac、Linux,由于其模拟运行速度很快画面流畅、且支持 OpenGL 3D 加速、多开、全屏等特性,并提供 Eclipse、IntelliJ IDEA 的开发插件,不仅是开发者们也是普通玩家们测试和运行 Android 软件/游戏的利器……
5191 0
Genymotion —— 强大好用高性能的 Android 模拟器
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
15天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
9天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
607 214