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 ...
 
随机推荐
- Ruby 技能图谱
			
# Ruby 技能图谱 说明: 本图谱只捡重点的列举,并非包含全部.文中所列举或没有列举的资源信息都可以在[awesome-ruby](https://github.com/markets/aweso ...
 - SVN迁移Gitlab步骤
			
概述 公司要求将之前使用SVN进行管理的项目迁移到Gitlab进行项目管理,但是运维连不上我们这边的SVN服务器,于是我们就得自己将SVN项目迁移到Gitlab.Yeah!终于有我表现的机会了. 要求 ...
 - js 中常用的设计模式
			
常用的设计模式: 工厂方法模式.单例模式.适配器模式.组合模式.迭代子模式 (23种设计模式) 总体来说设计模式分为三大类: ①创建型模式 共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原 ...
 - switch gnome-terminal tabs
			
Ctrl+Page Down (forward) and Ctrl+Page Up (backward). http://unix.stackexchange.com/a/67963
 - shell 读取配置文件的用法
			
https://blog.csdn.net/qq_36684665/article/details/81134179 亲测有用!
 - submlie 配置php运行
			
选择 "工具" -- "编译系统" -- "新编译系统"(英文版对应为 "Tools" -- "Build S ...
 - activiti7流程变量的测试(设置全局变量)
			
package com.zcc.activiti03; import org.activiti.engine.*;import org.activiti.engine.repository.Deplo ...
 - C/C++程序员 面试经历总结
			
最近在找工作,遇到了一些面试题,很惭愧的是很多都没答上来. 现在把一些问题总结一下,算是记录一下面试的经历吧.以后有空简单地回答一下, 同时也欢迎各位同仁解答,共同学习一下吧! 一.嵌入式C语言面 ...
 - Xshell与securecrt对比
			
一.功能对比1.Xshell功能- 支持布局切换- 可调整Script执行顺序- 提供多标签功能- 对linux支持度高- 支持IPv6- 全球用户的多语言支持- 支持用户定义的键映射- 灵活和强大的 ...
 - HBase 热点问题——rowkey散列和预分区设计
			
热点发生在大量的client直接访问集群的一个或极少数个节点(访问可能是读,写或者其他操作).大量访问会使热点region所在的单个机器超出自身承受能力,引起性能下降甚至region不可用,这也会影响 ...