delphi声明ansi字符串的大小

时间:2011-05-30 13:14:30

标签: arrays delphi delphi-2009 ansi

很容易定义一个大小为3的字符串(在旧的delphi代码中)

st:string[3];

现在,我们希望将代码移至ansi

st:ansiString[3];

不起作用!

和adcanced oem type

st:oemString[3]; 

同样的问题,其中

type
  OemString = Type AnsiString(CP_OEMCP);

如何声明一个固定长度的ansi字符串和新的oem类型?

更新:我知道它会创建一个固定长度的字符串。它是防止错误的软件设计的一部分,对程序至关重要。

5 个答案:

答案 0 :(得分:5)

您无需定义AnsiString的大小。

符号

string[3] 

用于Pascal(和Delphi 1)使用的短字符串,它主要用于传统目的。

短字符串长度可以是1到255个字节。第一个(“隐藏”)字节包含长度。

AnsiString是指向字符缓冲区的指针(0终止)。它有一些内部魔法,如引用计数。并且您可以安全地将字符添加到现有字符串,因为编译器将为您处理所有令人讨厌的细节。

UnicodeStrings与AnsiStrings类似,但使用unicode字符(在本例中为2个字节)。现在默认字符串(Delphi 2009)映射到UnicodeString。

类型AnsiString有一个构造来添加代码页(用于定义127以上的字符),因此CP_OEMCP:

OemString = Type AnsiString(CP_OEMCP);

答案 1 :(得分:4)

“Short Strings”是“Ansi”字符串,因为只有可用于向前兼容Delphi前代码。

       st: string[3];
自Delphi 2009以来,

将始终使用当前的Ansi代码页/字符集创建一个固定长度的“短字符串”。

但是这样的短字符串与所谓的AnsiString不同。短字符串没有代码页。由于短字符串没有引用计数。

代码页仅适用于AnsiString类型,它不是固定长度,而是可变长度和引用计数,因此是一种完全不同的类型,而不是由string[...]定义的短字符串。< / p>

您不能只按设计混合Short StringAnsiString类型声明。两者都被称为“字符串”,但它们是多种类型。

以下是Short String

的映射
  st[0] = length(st)
  st[1] = 1st char (if any) in st
  st[2] = 2nd char (if any) in st
  st[3] = 3rd (if any) in st

以下是AnsiStringUnicodeString类型的内存映射:

  st = nil   if st=''
  st = PAnsiChar if st<>''

这是PSt: PAnsiChar布局:

  PWord(PSt-12)^ = code page
  PWord(PSt-10)^ = reference count
  PInteger(PSt-8)^  = reference count
  PInteger(PSt-4)^  = length(st) in AnsiChar or UnicodeChar count
  PAnsiChar(PSt) / PWideChar(PSt) = Ansi or Unicode text stored in st, finished by a #0 char (AnsiChar or UnicodeChar)

因此,如果AnsiStringUnicodeString类型之间存在某些相似之处,则short string类型完全不同,并且无法按照您的意愿进行混合。

答案 2 :(得分:2)

只有当Delphi的unicode版本中的String [3]默认为3个WideChars时,这才有用。这会让我感到高兴,但如果是的话,请使用:

st: array[1..3] of AnsiChar;

答案 3 :(得分:1)

ansistring和unicodestring的大小将动态增长。编译器和运行时代码为您处理所有这些内容 请参阅:http://delphi.about.com/od/beginners/l/aa071800a.htm

有关更深入的说明,请参阅:http://www.codexterity.com/delphistrings.htm

长度可以是1 char到2GB之间的任何值。

答案 4 :(得分:1)

但旧的ShortString类型,Delphi中较新的字符串类型是动态的。它们根据需要增长和缩小。你可以预先将一个字符串预分配给一个调用SetLength()的给定长度,如果你必须逐个地将数据添加到你知道最终长度的字符串中,这对于避免重新分配内存很有用,但即使在那之后字符串仍然可以增长,添加或删除数据时收缩。 如果需要静态字符串,可以使用字符数组[0..n],其大小不会动态变化。