«Короткие строки» - это строки «Ansi», потому что они доступны только для обратной совместимости кода перед Delphi.
st: string[3];
всегда будет создавать «короткую строку» фиксированной длины с текущейКодовая страница Ansi / Char Set, начиная с Delphi 2009.
Но такие короткие строки НЕ совпадают с так называемыми AnsiString
.Там нет кодовой страницы для коротких строк.Поскольку для коротких строк не существует подсчета ссылок.
Кодовая страница существует только для типа AnsiString
, который имеет не фиксированную длину, а переменную длину и счетчик ссылок, так что это совершенно другой тип, чемкороткая строка, определяемая как string[...]
.
. Вы не можете просто смешивать объявления типов Short String
и AnsiString
в зависимости от конструкции.Оба называются «строками», но различаются по типам.
Вот отображение 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
Вот отображение памяти типа AnsiString
или UnicodeString
:
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
совершенно разнообразен, и не может быть смешан, как вы хотели.