Sign in Join
Wiki copytemporary

Character and string types/ru

Deutsch · English · Español · Français · Русский · 中文(中国)

Free Pascal поддерживает несколько символьных и строковых типов, от одиночных символов ANSI до юникодных строк, включая указатели. Различия также касаются кодировок и подсчёта ссылок.

AnsiChar

Переменная типа AnsiChar, называемого также Char, имеет размер ровно 1 байт и содержит один символ ANSI.

a

Ссылки

WideChar

Переменная типа WideChar, называемого также UnicodeChar, имеет размер ровно 2 байта и обычно содержит одну юникодную кодовую точку (обычно один символ) в кодировке UTF-16. Примечание: все юникодные кодовые точки закодировать 2-я байтами невозможно. Поэтому для представления одной кодовой точки может потребоваться пара WideChar.

a

Ссылки

Символьный массив

Ранние реализации языка Паскаль, использовавшиеся до 1978 года, не поддерживали строковый тип (за исключением строковых констант). Единственной возможностью сохранять строки в переменных было использование массивов символов. Этот подход имеет множество недостатков и более не рекомендуется. Тем не менее, он по-прежнему поддерживается для обеспечения обратной совместимости с устаревшим кодом.

Статический символьный массив

pascal
type
  TOldString4 = array [0..3] of Char;
var
  aOldString4: TOldString4; 
begin
  aOldString4[0] := 'a';
  aOldString4[1] := 'b';
  aOldString4[2] := 'c';
  aOldString4[3] := 'd';
end;

Статический символьный массив теперь содержит:

a b c d

Note: Неинициализированные символы могут иметь любые значения, которые зависят от содержимого памяти при её выделении под массив.

Динамический символьный массив

pascal
var
  aOldString: Array of Char; 
begin
  SetLength(aOldString, 5);
  aOldString[0] := 'a';
  aOldString[1] := 'b';
  aOldString[2] := 'c';
  aOldString[3] := 'd';
end;

Динамический символьный массив теперь содержит:

a b c d #0

Note: Неинициализированные символы динамического массива содержат #0, поскольку содержимое динамического массива изначально инициализируется 0 (или #0, или nil, или ...)

PChar

Переменные типа PChar являются указателями на Char, а также позволяют дополнительные действия. Они могут быть использованы для доступа к нуль-терминированным строкам в стиле C, например, для взаимодействия с библиотеками ОС или сторонними программами.

a b c #0
^

Ссылки

PWideChar

Переменная типа PWideChar является указателем на WideChar.

a b c #0 #0
^

Ссылки

String

Тип String может означать ShortString или AnsiString, в зависимости от опции {$H}. Когда опция выключена ({$H-}), String означает ShortString (короткая строка). Если не указано иное, её размер 255 символов. Когда опция включена ({$H+}), String без указания длины означает AnsiString, в противном случае -- ShortString заданной длины. В режиме {$mode DelphiUnicode} String означает UnicodeString.

Ссылки

ShortString

Максимальная длина коротких строк не превышает 255 символов в кодовой странице CP_ACP. Длина хранится в символе с индексом 0.

#3 a b c

Ссылки

AnsiString

AnsiString является строкой без ограничения длины, с подсчётом ссылок и гарантированно нуль-терминирована. Переменная типа AnsiString устроена как указатель -- фактическое содержимое строки хранится в куче, памяти выделяется по объёму содержимого.

<tbody>

</tbody>

Ссылки

UnicodeString

UnicodeStrings как и AnsiStrings использует подсчет ссылок и завершение нулём, но реализованы как массивы из WideChar, а не обычных Char.

Note: Вероятно, название UnicodeString двусмысленно из-за его применения в Delphi для Windows, использующей кодировку UTF-16; но это не единственный строковый тип, способный хранить юникодные строки (см. также UTF8String)...

<tbody>

</tbody>

Ссылки

UTF8String

В FPC 2.6.5 и ранее тип UTF8String был псевдонимом AnsiString. В FPC 2.7.1 и далее он определён как

pascal
UTF8String          = type AnsiString(CP_UTF8);

Он предназначен для хранения строк в UTF-8 (в юникоде), от 1 до 4 байт на символ. Заметьте, String тоже может содержать символы в кодировке UTF-8.

Ссылки

UTF16String

Тип UTF16String является псевдонимом типа WideString. В модуле LCL lclproc это псевдоним для UnicodeString.

Ссылки

WideString

Тип WideString (используется для представления юникодных строк в приложениях COM) похож на UnicodeString, но в отличие от него не использует подсчёт ссылок. Под Windows переменные этого типа распределяются специальными функциями системы, что позволяет использовать из для автоматизации OLE.

Широкие строки под Windows состоят из совместимых с COM и закодированных в UTF-16 (UCS2 под Windows 2000) байт, под Linux, Mac OS X и iOS они кодируются в обычный UTF-16.

<tbody>

</tbody>

Ссылки

PShortString

Переменная типа PShortString является указателем на первый байт переменной типа ShortString (содержащий длину строки).

#3 a b c
^

Ссылки

PAnsiString

Переменные типа PAnsiString являются указателями на переменные типа AnsiString. Однако, в отличие от переменных типа PShortString, они указывают не на первый байт заголовка, а на первый символ Char из AnsiString.

<tbody>

</tbody>

Ссылки

PUnicodeString

Переменные типа PUnicodeString являются указателями на переменные типа UnicodeString.

<tbody>

</tbody>

Ссылки

PWideString

Переменные типа PWideString являются указателями. Они указывают на первый символ переменной типа WideString.

<tbody>

</tbody>

Ссылки

Строковые константы

Если вы используете только английские константы, такие строки работают одинаково со всеми типами на всех платформах и на всех версиях компилятора. Неанглийские строки могут быть загружены как ResourceString или из файлов. Если вам нужно использовать неанглийские строки в коде, читайте ниже.

Для неанглийских строк существует множество кодировок. По умолчанию Лазарус сохраняет файлы как UTF-8 без BOM. Кодировка UTF-8 поддерживает все символы юникода. Это означает, что все строковые константы также сохранены в UTF-8. Лазарус также поддерживает смену кодировки файла, например, под Windows можно сохранить файл в локальной кодировке. Кодировки Windows ограничены вашей текущей языковой группой.

Строковый тип, исходник в UTF-8 С или без {$codepage utf8} FPC 2.6.5 и ниже FPC 2.7.1 и выше FPC 2.7.1+ с кодовой страницей UTF8
|Без Требует UTF8ToAnsi в RTL/WinAPI. Ок в LCL Требует UTF8ToAnsi в RTL/WinAPI. Ок в LCL Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI
|С Системная КС в RTL/WinAPI ок. Требует SysToUTF8 в LCL Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI
|Без Неверно везде Неверно везде Неверно везде
|С Системная КС в RTL/WinAPI ок. Требует UTF8Encode в LCL Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI
|Без Как AnsiString Неверно везде Неверно везде
|С Как AnsiString Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI
pascal
const 
  c='ãü';
  cstring: string = 'ãü'; // см. AnAnsiString:='ãü';
var
  s: string;
  u: UnicodeString;
begin
  s:=c;       // то же, что s:='ãü';
  s:=cstring; // не изменяет кодировку
  u:=c;       // то же, что u:='ãü';
  u:=cstring; // fpc 2.6.1: преобразует из системной КС в UTF-16,
              // fpc 2.7.1+: зависит от кодировки cstring
end;

См. также


From the Free Pascal wiki, page "Character and string types/ru", as it stood on 2020-09-03 after a change by Zoltanleo, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.

Revision 2, last changed by WikiArchive .

Talk about this page

Nobody has opened a bench for this page yet. Sign in to open one.