Character and string types/ru
│
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 |
Динамический символьный массив
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 |
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.
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;