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 ...
随机推荐
- 前端每日实战:77# 视频演示如何用纯 CSS 创作旗帜飘扬的动画
效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/qydvBm 可交互视频 此视频是可 ...
- 汇编学习(1)——win7 64位调出debug
一.安装方法: 1.下载一个dosbox和win7 32位debug.exe,安装dosbox,打开页面 2. 将debug.exe放入磁盘根目录,这里以D盘为例.在dosbox中输入mount ...
- mybatis PageBounds应用分页
第一步:分页工具类 package com.smartmorse.vo; import java.util.HashMap; import java.util.List; import java.ut ...
- spring mvc 接入cas登录
费劲千辛万苦开发出来的系统要接入sso 让我头大还好有大佬帮忙 首先在配置文件中写入启动的ip地址 HOST=http://127.0.0.1:8080/ 地址写你的地址和端口 然后在pom文件中导入 ...
- mysql分表分库 ,读写分离
1.分表 当项目上线后,数据将会几何级的增长,当数据很多的时候,读取性能将会下降,更新表数据的时候也需要更新索引,所以我们需要分表,当数据量再大的时候就需要分库了. a.水平拆分:数据分成多个表 b. ...
- Opengl ES Glew库 ----- By YDD的铁皮锅
前一篇随笔我写了Opengl的窗口创建,这一篇随笔我要写OpenGL glew库的使用.首先需要引入头文件h,库文件Lib和动态链接库DLL, 百度搜索OpenGL glew库找到这个纯英文网站,尽量 ...
- Javascript优点和缺点
优点: 函数是顶级对象 基于原型继承的动态对象 对象字面量和数组字面量 缺点: 全局变量 作用域 自动插入分号 保留字 Unicode typeof parseInt + 浮点数 NaN
- python获取Linux发行版名称
我必须从Python脚本中获取Linux发行版名称.dist平台模块中有一个方法: import platform platform.dist() 但在我的Arch Linux下它返回: >&g ...
- tire 树入门
博客: 模板: 前缀是否出现: /* trie tree的储存方式:将字母储存在边上,边的节点连接与它相连的字母 trie[rt][x]=tot:rt是上个节点编号,x是字母,tot是下个节点编号 * ...
- Ubuntu apt-get 更新/查看软件
ubuntu 升级软件: sudo apt-get update 更新源 sudo apt-get upgrade 更新已安装的包 sudo apt-get dist-upgrade 升级系统 ubu ...