3

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

st:string[3];

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

st:ansiString[3];

行不通!

对于高级 oem 类型

st:oemString[3]; 

同样的问题,在哪里

type
  OemString = Type AnsiString(CP_OEMCP);

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

更新:我知道它会创建一个固定长度的字符串。它是防止错误的软件设计的一部分,对于程序来说是必不可少的。

4

5 回答 5

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);
于 2011-05-30T13:18:13.373 回答
4

“Short Strings”是“Ansi”字符串,因为它只用于向后兼容预Delphi 代码。

       st: string[3];

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

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

代码页仅针对AnsiString类型存在,它不是固定长度的,而是可变长度的,并且是引用计数的,因此与由string[...].

根据设计,您不能只是混合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

这是AnsiStringorUnicodeString类型的内存映射:

  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)

AnsiString因此,如果和UnicodeString类型之间存在一些相似之处,则short string类型是完全多样化的,不能随心所欲地混合。

于 2011-05-30T13:44:35.210 回答
2

只有当 Unicode 版本的 Delphi 中的 String[3] 默认为 3 WideChars 时,这才有用。这会让我大吃一惊,但如果是这样,请使用:

st: array[1..3] of AnsiChar;
于 2011-05-30T13:20:32.657 回答
1

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

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

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

于 2011-05-30T13:41:05.627 回答
1

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

于 2011-05-30T14:48:18.370 回答