delphi基础篇之数据类型之二:2.字符串类型
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.字符串类型的更多相关文章
- delphi基础篇之数据类型之一:1.简单类型(Simple)
1.简单类型(Simple) 简单类型包括实数类型(Real)和有序类型(Ordinal).有序类型又包括整数类型.字符类型.布尔类型.枚举类型和子界类型等. 1-1.有序类型 有序类型是一个有序数的 ...
- delphi基础篇之数据类型之三:3.结构类型(Struct)
3.结构类型(Struct) 结构类型在内存中存储一组相关的数据项,而不是像简单数据类型那样单一的数值.结构数据类型包括:集合类型.数组类型.记录类型.文件类型.类类型.类引用类型和接口类型等.
- delphi基础篇之数据类型概论
delphi基础篇之数据类型概论 Object Pascal 语言提供了非常丰富的数据类型,即简单类型(Simple).字符串类型(String).结构类型(Struct).指针类型(Pointer) ...
- delphi基础篇之数据类型
Object Pascal 数据类型 数据类型与定义变量 Object Pascal 语言的最大特点是对数据类型的要求非常严谨.传递给过程或函数的参数值必须与形参的类型一致.在Object ...
- delphi基础篇之项目文件
delphi基础篇之项目文件 program Teacher2018; uses Forms, Unit1 in 'Unit1.pas' {Form1}, Unit2 in 'Unit2.pa ...
- python基础(5):数字和字符串类型
今天总结一下数据类型中的数字和字符串型. 预习: 小练习 一.数字(int,float) 在python3中数字类型只有整形,浮点型,复数.而复数在平时的编程中几乎用不到所以我们只要掌握整形和浮点型即 ...
- 【python基础语法】数据类型:数值、字符串 (第2天课堂笔记)
""" 数据类型: 一.数值类型:整数 浮点数 布尔值 二.序列类型:字符串.列表 元祖 三.散列类型:字典 集合 可变数据类型: 列表 字典 集合,可以改动内存地址数据 ...
- delphi基础篇之单元文件
Delphi单元文件 unit MainFrm; {库单元文件头} interface {接口部分由Interface开始implementation结束.声明引用的单元,常量,数据类型 ...
- java基础篇---I/O技术(二)
接着上篇http://www.cnblogs.com/oumyye/p/4314412.html java I/O流---内存操作流 ByteArrayInputStream和ByteArrayOut ...
随机推荐
- uploadify的使用错误
在看singwa的视频教程中,学习使用hui-admin模版,在使用uploadify插件上传图片中出现错误. ReferenceError: Can't find variable: $因为使用JQ ...
- 前端每日实战:77# 视频演示如何用纯 CSS 创作旗帜飘扬的动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qydvBm 可交互视频 此视频是可 ...
- 用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 SQLAlchemy 的 CRUD Create 增添数据 ...
- Scrapy爬虫实战-爬取体彩排列5历史数据
网站地址:http://www.17500.cn/p5/all.php 1.新建爬虫项目 scrapy startproject pfive 2.在spiders目录下新建爬虫 scrapy gens ...
- laravel新增路由文件
除去原有路由文件,有时为方便路由管理,我们可以新增独立路由文件,如:针对管理后台的路由文件. 1.在routes文件夹下创建新路由文件admin.php 2.在app\Providers\RouteS ...
- java 重新学习 (二)
一.栈内存里的引用变量并未真正存储对象的成员变量,对象的成员变量数据实际存放在堆内存中,而引用变量只是指向该堆内存里的对象. 二.堆内存里的对象可以有多个引用,若果堆内存中没有变量指向该对象,程序无法 ...
- docker内的服务无法获取用户真实IP
原文:blog.baohaipeng.top 背景:MySQL数据库和Redis运行在宿主机上(Linux),server运行在docker内,web运行在Nginx内(Nginx运行在docker内 ...
- img点击放大的js实现
业务需要,从后台获取图片列表,用img标签展示,由于图片太小看不清,需要点击放大,类似如下效果: 点击后放大(由于图片高度超出了页面,需要通过overflow:auto;设置滚动条,点击放大图片回到列 ...
- Spring Boot 2.1.6 发布了!
Java技术栈 www.javastack.cn 优秀的Java技术公众号 最新消息: Spring Boot 2.1.6 昨天正式发布了,日常更新一些依赖和修复一些 BUG,没什么硬菜! 重点来了, ...
- Java中的注解到底是如何工作的?
作者:人晓 www.importnew.com/10294.html 自Java5.0版本引入注解之后,它就成为了Java平台中非常重要的一部分.开发过程中,我们也时常在应用代码中会看到诸如@Over ...