百度空间 | 百度首页 
 
查看文章
 
Delphi 的字符及字符串 - Char、AnsiChar、WideChar、PChar、PAnsiChar、PWideChar
2008-12-11 14:59

//最常用的 string
var
str: string;   {定义}
begin
str := '万一'; {赋值}
ShowMessage(IntToStr(Length(str))); {长度是: 4}
end;




//长字符串 AnsiString; 在当前版本(2007)中的默认状态下, String 就是 AnsiString
var
str: AnsiString;
begin
str := '万一';
ShowMessage(IntToStr(Length(str))); {长度是: 4}
end;




//宽字符串 WideString (效率不及 AnsiString)
var
str: WideString;
begin
str := '万一';
ShowMessage(IntToStr(Length(str))); {长度是: 2}
end;




//定长字符串
var
str1: String[6]; {指定大小不能超过 255}
str2: String[100];
begin
{少给了也会占那些内存}
str1 := '万一';
ShowMessage(str1);                   {万一}
ShowMessage(IntToStr(Length(str1))); {4; 这是字符串的长度}
ShowMessage(IntToStr(SizeOf(str1))); {7; 这是占内存大小}

{多给了会被截断}
str1 := '万一的 Delphi 博客';
ShowMessage(str1);                   {万一的}
ShowMessage(IntToStr(Length(str1))); {6; 这是实际保存的字符串长度}
ShowMessage(IntToStr(SizeOf(str1))); {7; 这是占内存大小}

{问题: 不是声明大小为 6 吗? 怎么 SizeOf 是 7 ? }
{因为定长字符串会多出一个首字节来记忆字符串的实际长度}

{举例说明, 如果给 str2 按如下赋值, 那它的首字节(str2[0])肯定储存着字符 'A'}
str2 := 'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii'; {65个}
ShowMessage(str2[0]);                {A}
ShowMessage(IntToStr(Ord(str2[0]))); {65; 这是 'A' 在 ASCII 序列中的序号, 用的就是它}

{那以后可以用 Ord(str2[0]) 来代替 Length 判断字符串的长度吗? }
{对定长字符串是可以的; 不但能读取, 还可以像 SetLength 一样设置}
end;




//ShortString; 它相当于 String[255]
var
str: ShortString;
begin
str := '万一的 Delphi 博客';
ShowMessage(str);                   {万一的 Delphi 博客}
ShowMessage(IntToStr(SizeOf(str))); {256; 这是大小}
ShowMessage(IntToStr(Length(str))); {18 ; 这是实际长度}
ShowMessage(IntToStr(Ord(str[0]))); {18 ; 这是从首字节中取出的长度}
end;

//单字符 Char、AnsiChar (在目前版本(2007)中, 它们是一回事, 只有 1 字节大小)
var
  c: Char; {Char 类型的取值范围是: #0..#255, 用十六进制表示是: #$0..#$FF}
begin
  {用十进制方式赋值:}
  c := #65;
  ShowMessage(c); {A}

  {用十六进制方式赋值:}
  c := #$41;
  ShowMessage(c); {A}

  {用 Chr 函数代替 # 符号}
  c := Chr(65);
  ShowMessage(c); {A}
  c := Chr($41);
  ShowMessage(c); {A}

  {Char 长度当然会是 1}
  ShowMessage(IntToStr(Length(c))); {1}

  {Char、AnsiChar 允许这样方便地赋值(也就是和 1 字节长度的字符串是兼容的):}
  c := 'B';
  ShowMessage(c); {B}
end;

//UniCode 字符 WideChar; 和 AnsiChar 不同, WideChar 是占 2 字节大小. var c: WideChar; {WideChar 的取值范围是: #0..#65535, 用十六进制表示是: #$0..#$FFFF} begin {WideChar 兼容了 AnsiChar 的 #0..#255; 但占用了 2 字节大小} c := #65; ShowMessage(c); {A} ShowMessage(IntToStr(Length(c))); {1; 这是字符长度} ShowMessage(IntToStr(SizeOf(c))); {2; 但占用 2 个字节} {用十六进制赋值} c := #$4E07; ShowMessage(c); {万} ShowMessage(IntToStr(Length(c))); {1; 这是字符长度} ShowMessage(IntToStr(SizeOf(c))); {2; 但占用 2 个字节} {用十进制赋值} c := #19975; ShowMessage(c); {万} {如果不超出 #255 的范围是可以直接赋值的} c := 'B'; ShowMessage(c); {万} {这样不行} //c := '万'; {这是 Delphi 的支持问题, 估计 Delphi 2008 应该可以解决} {可以这样变通一下:} c := WideString('万')[1]; ShowMessage(c); {万} {用 WideChar 的方式显示我的名字} ShowMessage(#19975#19968); {万一} ShowMessage(#19975 + #19968); {万一} ShowMessage(#$4e07#$4e00); {万一} end;
//字符指针 PChar、PAnsiChar; 在当前版本(2007)中它们没有区别. var p: PChar; str: string; begin {可以给 PChar 直接赋予字符串常量} p := '万一'; ShowMessage(p); {万一} ShowMessage(IntToStr(Length(p))); {4} {给变量值需要转换} str := '万一的 Delphi 博客'; p := PChar(str); {转换} ShowMessage(p); {万一的 Delphi 博客} ShowMessage(IntToStr(Length(p))); {18} end;
//宽字符指针 PWideChar var p: PWideChar; str: WideString; {注意这里不是 String} begin {可以给 PWideChar 直接赋予字符串常量} p := '万一'; ShowMessage(p); {万一} ShowMessage(IntToStr(Length(p))); {2} {给变量值需要转换} str := '万一的 Delphi 博客'; p := PWideChar(str); {转换} ShowMessage(p); {万一的 Delphi 博客} ShowMessage(IntToStr(Length(p))); {13} end;

唉~: 代码着色在这里又出现问题, 不过现在没心情修改了, 以后再说吧.



类别:delphi园地 | 添加到搜藏 | 浏览() | 评论 (2)
 
最近读者:
 
网友评论:
4
2009-02-06 15:46 | 回复
var str:string; str1: String[6]; begin ShowMessage(IntToStr(SizeOf(str))); {4} ShowMessage(IntToStr(Length(str))); {0} str:='1234567890' ; ShowMessage(IntToStr(SizeOf(str))); {4}//此处不接 ShowMessage(IntToStr(Length(str))); {10} str1:='1234567890'; ShowMessage(IntToStr(SizeOf(str1))); {7} ShowMessage(IntToStr(Length(str1))); {6} end;
 
5
2009-02-06 15:55 | 回复
var str2: String[100]; str2 := 'iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii'; {65个} ShowMessage(str2[0]); {A} ShowMessage(IntToStr(Ord(str2[0]))); {65; 这是 'A' 在 ASCII 序列中的序号, 用的就是它} 学了这么久delphi 才发现
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu