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 года, не поддерживали строковый тип (за исключением строковых констант). Единственной возможностью сохранять строки в переменных было использование массивов символов. Этот подход имеет множество недостатков и более не рекомендуется. Тем не менее, он по-прежнему поддерживается для обеспечения обратной совместимости с устаревшим кодом.
Статический символьный массив
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: Неинициализированные символы могут иметь любые значения, которые зависят от содержимого памяти при её выделении под массив.
Динамический символьный массив
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 и далее он определён как
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 |
- 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;См. также
- Поддержка юникода в FPC
- Поддержка юникода в LCL
- Пособие по TStringList-TStrings
- Краткая история String
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.
Talk about this page
Nobody has opened a bench for this page yet. Sign in to open one.
