DelphiXE下的字符串变化

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

一、字符类型

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]只能得到“中”的第一个字节。

 

 

 

时间: 2024-10-14 13:57:55

DelphiXE下的字符串变化的相关文章

DelphiXE3下的字符串

DelphiXE3下的字符串 在delphi中,我们常用String来声明字符串. procedure TestStringForDelphi;var   strName: String;   nLenName: Integer;begin   strName := '中国a';   nLenName := Length(strName);    ShowMessage('字符串"' + strName +  '"长度为:' + IntToStr(nLenName) +':第一个字符是

请问怎样实现“Combobox下拉菜单变化后文本框的数组会跟着变化”

问题描述 请问各位高手怎样实现"Combobox下拉菜单变化后文本框的数组会跟着变化"?举例:Combobox控件菜单内容分别为"kg/s","kg/min","kg/h",当单位变化时,文本框里的数值会随着单位的改变而改变. 解决方案 解决方案二:在选项变化的事件里写代码改变文本框的值解决方案三:引用1楼xdashewan的回复: 在选项变化的事件里写代码改变文本框的值 请告诉我代码怎么写谢谢解决方案四:uphttp://c

请问下这个字符串怎么用正则表达式表示?

问题描述 #A||*||B||*||123456789||*||1313165464646464646464031||*||#C 解决方案 解决方案二:大哥些怎么没有人回答拉解决方案三:/^#A¦¦*¦¦B¦¦*¦¦123456789¦¦*¦¦1313165464646464646464031¦¦*¦¦#C$/解决方案四:不是吧这样不行的解决方案五:提问要注意下提问的智慧,你就给这么一个实例,什么也不说,就让大家给个正则,那我写[sS]*就能匹配,但你肯定说不行这种问题我是肯定不会费那脑细胞写一

用JavaScript计算在UTF-8下存储字符串占用字节数_javascript技巧

最近和JavaScript纠缠上了. 遇到这么一个问题,数据库的字符集为UTF-8的,要在页面上使用JavaScript验证输入的文本用UTF-8存储时占用字节长度.JavaScript的String对象有length属性,但是这个计算的是字符数,不是字节数(问题总是翻来覆去的,记得当年玩Delphi的时候,还得写程序计算字符串的字符数,因为Delphi中String的length是字节数...).偷懒一点的办法是将验证代码中最大长度设置为数据库中对应字段的长度的1/3,但是这样准确来说有点不合

php 不同编码下的字符串长度区分_php技巧

UTF-8的中文字符串是三个字节 复制代码 代码如下: <?php //编码UTF-8 echo strlen('测试文字a测试文字'); echo '-'; echo mb_strlen('测试文字a测试文字','utf-8'); ?> 输出:25-9 GB2312的中文字符串是二个字节 复制代码 代码如下: <?php //编码GB2312 echo strlen('测试文字a测试文字'); echo '-'; echo mb_strlen('测试文字a测试文字','Gb2312')

asp下实现字符串的补充fill()_应用技巧

复制代码 代码如下: <%  '功能:在一个字符串前后补全另一字符串  '来源:http://jorkin.reallydo.com/article.asp?id=452  Public Function Fill(ByVal sString, ByVal sStr)      Fill = RFill(LFill(sString, sStr), sStr )  End Function  %>  复制代码 代码如下: <%  '功能:在一个字符串前面补全另一字符串  '来源:http:

unix下对于字符串变量的各种操作总结

    在unix like系统的shell中,提供了很多操作字符串变量的灵活语法,我们接下来依次来看一看. apple@kissAir: ~$path=$PATH apple@kissAir: ~$echo $path /opt/local/bin:/opt/local/sbin:/Users/apple/.rvm/gems/ruby-2.1.1/bin:/Users/apple/.rvm/gems/ruby-2.1.1@global/bin:/Users/apple/.rvm/rubies/

DelphiXE下的内存管理

自Delphi2007开始使用了FastMM作为内存管理器,替代了原有的颇受诟病的自带内存管理.使用也非常方便,只要在工程文件的源码里使用下面的一行代码即可. ReportMemoryLeaksOnShutdown := True; 当程序关闭时,会自动检测内存泄露,并弹出提示框. FastMM 是适用于delphi的第三方内存管理器,在国外已经是大名鼎鼎,在国内使用率也很高,网上也不乏介绍它的文章.可以到 http://sourceforge.net/projects/fastmm/ 下载使用

PHP下对字符串的递增运算代码_php技巧

有同学问了一个问题: 复制代码 代码如下: <?php for($i = 'A'; $i <= 'Z'; $i++) { echo $i; } //输出是啥? 输出是: 复制代码 代码如下: ABCDEFGHIJKLMNOPQRSTUVWXYZAAABACADAEAFAGAHAIAJAKALAMANAOAPAQARAS--. 为啥? 其实很简单, PHP的手册中也有说明, 只不过恐怕很多人不会一章一节的把手册仔细阅读一遍: 复制代码 代码如下: PHP follows Perl's conve