有关delphi的字符(100分)

  • 主题发起人 主题发起人 wzpok
  • 开始时间 开始时间
W

wzpok

Unregistered / Unconfirmed
GUEST, unregistred user!
delphi中的字符类型有很多之间转化也很烦 我搞不清到底有那些 相互
怎么转化?望高手详细指点!
 
字符类型有什么可转化的?不就是char吗?
字符串函数常用的有inttostr,strtoing,pchar()强转等,
不知道你要的是什么?
 
我想你可能是不大清楚string,pchar,array[0..x]of char 这些有关字符的转化
吧?我以前发过一份解答,现在改了一下贴过来:

1. String是Pascal使用的字符串格式.它分为ShortString,
WideString和AnsiString,String缺省为AnsiString.
ShortString的最大长度为255个字符.
AnsiString 的最大长度为2^31个字符.
WideString 的最大长度为2^30个字符.
AnsiString和WideString的区别在于字符集的不同.
AnsiString对应于AnsiChar,WideString对应于WideChar.
具体你可以参考Delphi Help中String Type帮助.

2. PChar是Delphi为了和C语言的字符串类型(char *)兼容,
以便调用Windows API而建立的数据类型.所以pchar实际是
^^^^^^^^^^^^^^^^^^^你会在调用API时频繁使用PChar
一个指针.一般使用方法是:
pchar eg1;
GetMem(eg1,Size)

...
FreeMem(eg1,Size);
你还可以用以下方法;
eg2 :array[0..Size] of char;
然后可以把eg2看作pchar来用,且它已预先分配了内存.
要注意的是定义eg2的字符数组下界必须是0 !否则将会出现错误.

3. 在Delphi 1.0中的String和PChar的相互转换为:
function StrPas(str :pchar):string;
function StrPCopy(Dest:Pchar;Source:string):pchar;
在Delphi 2.0和更高版本中的String和PChar的相互转换很简单:
String ->Pchar: pch :=Pchar(str)
Pchar ->String: str :=pch;

 
StrToInt
StrToInt64
StrToIntDef
StrToInt64Def
IntToStr
StrLen
StrEnd
StrCopy
StrMove
StrECopy
StrLCopy
StrPCopy
StrPLCopy
StrCat
StrLCat
StrComp
StrIComp
StrLComp
StrLIComp
StrScan
StrRScan
StrPos
StrUpper
StrLower
StrPas
StrAlloc
StrBufSize
StrNew
StrDispose
还有inttohex类的要吗?
 
我不懂ShortString, WideString和AnsiString,String的区别及pchar得用法
 
>ShortString,WideString和AnsiString,String的区别
只是位的问题,帮助和资料都讲得很明白了
pchar串与标准字符串兼容,有空结束符。一般用到api时都要用到。
 
字符串有三种类型:ShortString,WideString和AnsiString
缺省情况下,string就是指AnsiString.
shortstring有长度限制,最多256个字符,
AnsiString和WideString的区别在于字符集的不同.

由于Delphi支持调用windows api,而windows是用C编的,为了
在Pascal调用C函数,就必须将string转化为C的字符串格式,
所以使用PCHAR,所以有了STRING和PCHAR之间的相互转化,
如何转化请看我前面的讲解。
 
柳五公子:
ShortString最多255个半角字符

AnsiString和WideString的区别在于:
AnsiString认为字符是8位的,处理双字节的字符时使用MBCS(multi-byte
character system)系统,即Ascii字符小于$80,每个汉字作为两个子符处理。
关于MBCS及MBCS函数,可以按MBCS utilities搜索Delphi帮助。

WideString认为字符是16位的。Ansi和汉字字符都是16位的,一般使用UniCode
字符集。

UniCode在Windows 95中没有完全实现,中文Windows 95实际上用的DBCS(double-
byte character sets)系统,所以Delphi主用使用AnsiString处理字符,使用
AnsiString字符集既可以处理汉字,有可以兼容使用Ansi字符集的西文系统。
而且vcl是使用AnsiString实现的,所以使用WideString在Delphi中实际使用
会非常不方便。
 
看来大家都对这么点分争行恐后哇。 :)

对于这位朋友的问题我个人觉得,一般情况下对它们稍有一些认识也就可以了。
看我们常用的String,如果没特别的必要就不要用WideString, ShortString
等事实上,常用、惯用的东西一般都是好的。(象流行感冒?)
 
学会用,strpcopy,
strpas
和符号@就很容易了!
 
虽然这个问题很简单,但其实很不人并不完全清楚。

1.ShortString最大长度是由程序员指定的,但最多255个字符是不错。问题
是Delphi在处理时有很大不同。ShortString可以用Str[0]取字符串长。在
申请局部变量或者传递参数时ShorString在堆栈段分配空间,而其它类型的
串是在堆中;如:MyStr: string[48];在堆栈段分配52字节空间存放一个短
串。

2.String分配和释放由Delphi去优化,你不用关心是否会造成内存泄漏。在每
一个String变量前都有详细的RTTI去管理它。AnsiString和WideString其实
和String在使用时是一样的,因为Delphi并未为AnsiString和WideString建
立特殊的函数。传递参数时是一个地址。例如将流中的数据读到一个String
中,应该按下列方式操作:
SetLength(Result, Count)
//相当于分配空间
Stream.Read(Result[1], Count)
//读数据到串

3.PChar类型纯粹为兼容C和WindowsAPI而设,使用非常麻烦。
APChar := StrAlloc(n)
-- 分配空间
StrDispose(APChar)
-- 释放空间
当然是以地址来传递的。
 
其实就象前面某人说的,您在猪肉的时候不必知道这头猪的样子,当然您在吃进口牛排的时候可以考虑一下是否这头牛吃过二恶英感染过的饲料。
我想现在也没有人用DELPHI1了,在Delphi32中默认的字符串是string,也就是长字符串,而以前的标准pascal字符串现在叫shortstring,如果不是特别需要,就用默认的字符串,这种长字符串尽管使用起来特别简单,其实内部很复杂,简单说动态分配内存的数组加指针。而如果在API中用到pchar是为了和C++兼容,一般可以用
字符数组代替,例如:
var buf:array[0..255]of char;
gettempdir(buf,sizeof(buf));
这只是一个示范的例子,
 
最简单的说法:
shortstring是一块内存, 长度最长为255字节.

widestring和ansistring和pchar都是一个32位的整数(指向实际字串存放的地址)

pchar和string的区别:
string指向的地址是由delphi全权管理, 分配和释放对用户完全透明. (通过一些技巧可以访问
到这个地址值), 但是非法改变这个地址值会引起不可预料的错误.
pchar归delphi核心管理的只有一个32位数, 至于这个32位数中存放什么可以由用户随便指定.
(可以存放4个字符, 或者一个整数, 或者一个地址, 甚至直接放一个single浮点数. 总之最多放
32位数据),常用(delphi默认与约定成俗)的方法是放一个地址, 指向具体数据存放空间,
所以pchar和pointer是一回事, 只是在编译器中对pchar型增强了些操作, 比如, 默认指向的
是一个由0字符为结尾的字符串, 步进为1字节(pch+1是合法表达式)等等.

widestring也很有用处, 特别对于处理包含中文的字符串时.
 
多人接受答案了。
 
后退
顶部