分享

xe unicode byte char函数与长度

 quasiceo 2013-01-11
ZeroMemory
CopyMemory

Copy
Move
Pos

Length
SetLength
  t:AnsiString;
  t2:WideString;

使用MidBStr

对于ansiString,Length长度基于字节.无论2006还是xe.
Ansi前缀函数的都基于字符

在2006中.默认字符是AnsiChar,
对于AnsiString类型的变量
MidStr    基于字符
Rightstr
Midstr

xe中默认字符是WideChar
对于AnsiString类型的变量
Midstr  基于字节



t:='中国1';
  showMessage(inttostr(Length(t)));//5
显然不能为3,否则,Setlength(3),输入3个中文字符就越界了.前后不一致
AnsiLength(t) = 3

AnsiPos('1',t);//3基于字符
  showMessage(AnsiMidstr(t,2,2));//基于字符
  showMessage(Midstr(t,2,2));//基于字节            xe

 showMessage(inttostr(Length(t)));  //5          2006
 Rightstr(t,2); //基于字符                                   2006
  showMessage(Midstr(t,2,2));//基于字符            2006

    msg:string;

   msgW:widestring;

begin

   msg :='中文123123';

   msgW  := '中文123123';

Delete(msg,1,4);//结果是 msg='123123'

Delete(msgW ,1,2);//结果是 msgW ='123123'




t2:='中国1';
  showMessage(inttostr(Length(t2)));//3

delphi中如何将byte[]字节数组类型的数据转化成string类型的字符串数据

B:array[0..15] of byte
S:string;

已知B,如何将B 转化为S 然后输出S

S := StrPas(@B);
记得B里要有 #0

For i:=low(b) to high(b) do
begin
  s:=s+char(b[i]);
end;

Move(b[0],s[1],Length(b));



在delphi2010中fillchar中的char还是按字节来做.

MyRec = record
    I: Integer;
    S: string;
    R: Real;
  end;

  PMyRec = ^MyRec;


 Rec := PRec^;

var
  PRec: PMyRec;
  Rec: MyRec;

CopyMemory(@Rec,PRec,Sizeof(MyRec));

需要清零的成员包括 string、动态数组类型、interface 等由 rtl 管理生存期的类型。因为不清零的话,这些个成员就是一个个野指 针,rtl 一跑就直接挂了。这里 TMyRec 里的 S 就是需要清零的成员,New 相当于 GetMem+Initialize

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多