Character and string types/ru

From Lazarus wiki
Jump to navigationJump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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;

См. также