Копия викизеркало

Это зеркало вики с pascal.chat. Правка, история и вход — там.

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.

Версия 2, последнее изменение: WikiArchive, .