Character and string types/ru

From Free Pascal wiki
Jump to navigationJump to search

Deutsch (de) English (en) español (es) français (fr) русский (ru) 中文(中国大陆) (zh_CN)

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

AnsiChar

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

a

Ссылки

WideChar

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

a

Ссылки

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

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

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

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
Light bulb  Примечание: Неинициализированные символы могут иметь любые значения, которые зависят от содержимого памяти при её выделении под массив.

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

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
Light bulb  Примечание: Неинициализированные символы динамического массива содержат #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 устроена как указатель -- фактическое содержимое строки хранится в куче, памяти выделяется по объёму содержимого.

a b c #0
RefCount Length

Ссылки

UnicodeString

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

Light bulb  Примечание: Вероятно, название UnicodeString двусмысленно из-за его применения в Delphi для Windows, использующей кодировку UTF-16; но это не единственный строковый тип, способный хранить юникодные строки (см. также UTF8String)...
a b c #0 #0
RefCount Length

Ссылки

UTF8String

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

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.

a b c #0 #0
Length

Ссылки

PShortString

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

#3 a b c
^

Ссылки

PAnsiString

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

a b c #0
RefCount Length ^

Ссылки

PUnicodeString

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

a b c #0 #0
RefCount Length ^

Ссылки

PWideString

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

a b c #0 #0
Length ^

Ссылки

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

Если вы используете только английские константы, такие строки работают одинаково со всеми типами на всех платформах и на всех версиях компилятора. Неанглийские строки могут быть загружены как 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
AnAnsiString:='ãü'; Без Требует UTF8ToAnsi в RTL/WinAPI. Ок в LCL Требует UTF8ToAnsi в RTL/WinAPI. Ок в LCL Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI
AnAnsiString:='ãü'; С Системная КС в RTL/WinAPI ок. Требует SysToUTF8 в LCL Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI
AnUnicodeString:='ãü'; Без Неверно везде Неверно везде Неверно везде
AnUnicodeString:='ãü'; С Системная КС в RTL/WinAPI ок. Требует UTF8Encode в LCL Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI
AnUTF8String:='ãü'; Без Как AnsiString Неверно везде Неверно везде
AnUTF8String:='ãü'; С Как AnsiString Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI
  • W-WinAPI = функции Windows API с "W", UTF-16
  • A-WinAPI = функции Windows API без "W", 8-битная кодовая страница
  • Системная КС = 8-битная системная кодовая страница ОС. Например, 1251.
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;

См. также