2.字符串类型

2.1.ShortString
ShortString 又称为短字符串(相对的,Ansistring、widestring、unicodestring 称为长字符串),其实质上是一个编译器内置的字符数组,类似(不是等效)于以下类型:
Type
ShortString = array[0..255] of ansichar;
其容纳由 256 个 AnsiChar 组成的字符串,但第一个字符有特殊用途,所以 shortstring 类型的字符串长度不可超过 255byte。
ShortString 的第一个字节的值等于字符串的实际长度。故而获取 ShortString 字符串实际长度的方法有 2 种:

一是利用标准函数 Length();

二是直接利用第 1 个字节的值。
例如:
Var
Str;shortString;
Begin
Str := 'abcdefg';
Writeln(inttostr(integer(str[0]))); //显示 7
Writeln(inttostr(length(str))); //显示 7
End.

2.2AnsiString

AnsiString 类型也被称为长字符串。此类型的字符串由ASCII 扩展字符集组成。AnsiString 类型实质上是一个指针类型,指向字符串首个字符的地址,也就是第13个字节(delphi2009以后)。利用标准函数 Sizeof()可知此类型变量在内存中占用 4 个字节。为了节约内存,Delphi 将AnsiString 字符串的字符串本身分配在堆中,而在栈中留下一指向字符串的指针,这个指针就是 AnsiString 类型的变量。使用字符串索引时有两点值得注意:索引应当从 1 开始。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
A8 03 01 00 FF FF FF FF 0F 00 00 00 48 75 61 6E 67 4A 61 63 6B 79 41 41 41 42 41 00
   代码页 字符宽度         引用次数      字符串的字符数                                                        字符串实际内容 结束符
936 1 -1 15 H u a n g J a c k y A A A B A #0
$03A8就是936,
    查MSDN 
    936 - gb2312
每个字
符所占
的字节

    (ANSI为1)
对于常量字符串,引用计数总是-1,Delphi并未作出优化。当字符串为变量时计数大于等于1。  

3.WideString
WideString 与 AnsiString 基本一样,除以下几点:

  • WideString 没有引用计数
  • 其中容纳由16bit unicode 字符组成的字符串
  • 对于 WideString 类型的字符串索引会得到某个字符的值而非某个字节的值。
  • 兼容于 COM 中的 BSTR 类型;实际上此类型最大的用途就在于此

4.UnicodeString
UnicodeString 与 AnsiString 基本相同,唯一的区别在于前者容纳的字符串由Unicode 字符集中的字符组成。事实上 UnicodeString 的出现更多是为了弥补 WideString在处理 Unicode 编码时的不足。在绝大多数场合,UnicodeString 比 WideString 更适合。但编写 COM 程序时,只能选择 WideString。注意对 unicodestring 字符串进行索引时得到的也是某个字符的值。
5.String
String 为 Delphi 的保留字,用作 UnicodeString 类型的一个别名。

  • 在早期版本中如 Delphi7 当中包含编译指令{$H},当其处于{$H+}状态时 string 等价于Ansistring 类型;当其处于{$H-}状态时 string 等价于 shortstring 类型。Delphi2010 中此编译指令已被废弃,无论此指令处于何种状态 string 均等价于 UnicodeString。
  • 作为 Delphi 的保留字,String 也用于声明自定义长度的 shortString 类型变量。默认情形下 shortString 类型的变量占用 256byte 的内存,我们可手动定义其占用的字节数:
  • Var
  • Mystr:String[n];
  • Mystr 在内存中将只占 n+1 个字节。显然,N 的值不可超过 255。此声明相当于:
  • Var
  • Mystr:array[0..n] of ansichar;

6.UCS4String
USC4String 类型容纳 USC4 字符集中的字符组成的字符串。其声明如下:
type
UCS4String = array of UCS4Char;
此类型的字符串基本不用。在笔者看来,此类型现时只有两个用途:其一为方便Delphi 在未来迁移时花费最小的代价,毕竟 UCS4 编码是将来的趋势;其二是用于各种编码的字符串的转换,其它编码的字符串转化至 UCS4String 不会有任何的数据丢失,故而此类型很适合作为字符串转换时的中间格式。
7.CodePaged AnsiString
从前面的叙述可知 AnsiString 用于容纳扩展 ASCII 字符集字符形成的字符串。事实上,这种说法并不精确。较为精确的说法是:AnsiString 能够容纳所有编码格式的字符串,只要计算机上安装了相应的字符集,但只有 AnsiString 字符串的编码为本地扩展ASCII 字符集时才能被正确显示。
8.RawByteString
RawByteString 的原型为:
Type
RawByteString = type AnsiString($FFFF);
注意:$FFFF 不代表现有的任何编码方式。
使用 RawByteString 时注意:作为函数参数时,RawByteString 只能用作 const 或value 方式传递的参数,不可用于 var 方式传递。
9.Nul 结尾字符串
Delphi 不存在 C 风格的 NULL 结尾的字符串。作为替代,可以使用以下 2 种方法来模拟:

  • 利用序数从 0 开始的静态字符数组代替字符串。
  • 使用字符指针 PChar 与 PWideChar。

注意:使用字符数组替代字符串时应保证开启了{$X+}指令,此指令默认为开启状态。

delphi基础篇之数据类型之二:2.字符串类型的更多相关文章

  1. delphi基础篇之数据类型之一:1.简单类型(Simple)

    1.简单类型(Simple) 简单类型包括实数类型(Real)和有序类型(Ordinal).有序类型又包括整数类型.字符类型.布尔类型.枚举类型和子界类型等. 1-1.有序类型 有序类型是一个有序数的 ...

  2. delphi基础篇之数据类型之三:3.结构类型(Struct)

    3.结构类型(Struct) 结构类型在内存中存储一组相关的数据项,而不是像简单数据类型那样单一的数值.结构数据类型包括:集合类型.数组类型.记录类型.文件类型.类类型.类引用类型和接口类型等.

  3. delphi基础篇之数据类型概论

    delphi基础篇之数据类型概论 Object Pascal 语言提供了非常丰富的数据类型,即简单类型(Simple).字符串类型(String).结构类型(Struct).指针类型(Pointer) ...

  4. delphi基础篇之数据类型

      Object Pascal 数据类型    数据类型与定义变量 Object Pascal 语言的最大特点是对数据类型的要求非常严谨.传递给过程或函数的参数值必须与形参的类型一致.在Object ...

  5. delphi基础篇之项目文件

    delphi基础篇之项目文件   program Teacher2018; uses   Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pa ...

  6. python基础(5):数字和字符串类型

    今天总结一下数据类型中的数字和字符串型. 预习: 小练习 一.数字(int,float) 在python3中数字类型只有整形,浮点型,复数.而复数在平时的编程中几乎用不到所以我们只要掌握整形和浮点型即 ...

  7. 【python基础语法】数据类型:数值、字符串 (第2天课堂笔记)

    """ 数据类型: 一.数值类型:整数 浮点数 布尔值 二.序列类型:字符串.列表 元祖 三.散列类型:字典 集合 可变数据类型: 列表 字典 集合,可以改动内存地址数据 ...

  8. delphi基础篇之单元文件

    Delphi单元文件 unit MainFrm; {库单元文件头} interface        {接口部分由Interface开始implementation结束.声明引用的单元,常量,数据类型 ...

  9. java基础篇---I/O技术(二)

    接着上篇http://www.cnblogs.com/oumyye/p/4314412.html java I/O流---内存操作流 ByteArrayInputStream和ByteArrayOut ...

随机推荐

  1. 提供 web前端、H5、html页面 技术服务

    如有前端页面的需求请在评论区留言  第一时间进行回复

  2. Unicode数据类型的是是非非(转)

    转:http://cio.chinabyte.com/344/9002344.shtml 在SQL Server数据库中,数据类型主要分为两类,分别为Unicode数据类型与非Unicode数据类型. ...

  3. AndroidManifest.xml配置文件详解(转)

    转载博客:http://blog.csdn.net/shagoo/article/details/7485958# AndroidManifest.xml配置文件对于Android应用开发来说是非常重 ...

  4. gokit 统计分析 M2M接入服务 OTA固件升级 硬件社交化

    统计分析 M2M接入服务  OTA固件升级 硬件社交化 统计分析 为智能硬件定制的统计分析服务.只需添加入一行代码的集成工作,多维度的设备使用和用户行为数据就能自动统计出来. 演示 特色一:设备上线情 ...

  5. 本地安装了flash,前台浏览器还显示需要安装flash?是因为版本需要对应

    NPAPI:适用于FireFox(火狐).Safari(苹果).Opera (欧朋,12.17版以下) PPAPI:适用于Chromium浏览器.Opera (欧朋,15.00版以上) ActiveX ...

  6. Newline required at end of file but not found

    在启动vue项目中遇到 解决方法 在main.js文件的最后一行加一个空行就可以了

  7. 全局配置一个ajax的错误监控

    全局配置一个ajax的错误监控,比如$(document).ajaxError(function(evt, req, settings){    if(req && (req.stat ...

  8. 文件上传&&验证文件格式

    $(function(){ $(".layui-progress").hide(); $("[data-upload-file]").each(function ...

  9. upc组队赛12 Cardboard Container【枚举】

    Cardboard Container Problem Description fidget spinners are so 2017; this years' rage are fidget cub ...

  10. Django框架(二十五)—— Django rest_framework-路由控制与响应器

    路由控制与响应器 一.路由控制 # 1.基本路由: url(r'^publish/$', views.PublishView.as_view()), # 2.半自动路径:views.PublishVi ...