Difference between revisions of "Character and string types/ru"
(Initial translation) |
|||
(17 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
− | {{ | + | {{Character and string types}} |
Free Pascal поддерживает несколько '''[[Char|символьных]] и [[String|строковых]] типов''', от одиночных символов ANSI до юникодных строк, включая указатели. | Free Pascal поддерживает несколько '''[[Char|символьных]] и [[String|строковых]] типов''', от одиночных символов ANSI до юникодных строк, включая указатели. | ||
Line 6: | Line 6: | ||
== AnsiChar == | == AnsiChar == | ||
− | Переменная типа '''AnsiChar''', называемого также '''Char''', имеет размер ровно 1 байт и содержит один | + | Переменная типа '''AnsiChar''', называемого также '''[[Char]]''', имеет размер ровно 1 байт и содержит один символ ANSI. |
{| class="wikitable" style="text-align:center; width:25px" | {| class="wikitable" style="text-align:center; width:25px" | ||
Line 14: | Line 14: | ||
==== Ссылки ==== | ==== Ссылки ==== | ||
− | * [http://www.freepascal.org/docs-html/ref/ | + | * [http://www.freepascal.org/docs-html/ref/refsu6.html AnsiChar в документации FPC] |
* [[Char|Использование Char]] | * [[Char|Использование Char]] | ||
== WideChar == | == WideChar == | ||
− | Переменная типа '''WideChar''', называемого также '''UnicodeChar''', имеет размер ровно 2 байта и содержит | + | Переменная типа '''WideChar''', называемого также '''UnicodeChar''', имеет размер ровно 2 байта и обычно содержит одну [[LCL Unicode Support/ru|юникодную]] кодовую точку (обычно один символ) в кодировке UTF-16. |
− | + | Примечание: все юникодные кодовые точки закодировать 2-я байтами невозможно. Поэтому для представления одной кодовой точки может потребоваться пара WideChar. | |
{| class="wikitable" style="text-align:center; width:50px" | {| class="wikitable" style="text-align:center; width:50px" | ||
Line 28: | Line 28: | ||
==== Ссылки ==== | ==== Ссылки ==== | ||
− | * [http://www.freepascal.org/docs-html/ref/ | + | * [http://www.freepascal.org/docs-html/ref/refsu7.html WideChar в документации FPC] |
− | * [ | + | * [http://ru.wikipedia.org/wiki/UTF-16 Сведения об UTF-16 в Wikipedia] |
* [[doc:rtl/system/unicodechar.html|UnicodeChar в документации RTL]] | * [[doc:rtl/system/unicodechar.html|UnicodeChar в документации RTL]] | ||
Line 41: | Line 41: | ||
===Статический символьный массив=== | ===Статический символьный массив=== | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
type | type | ||
TOldString4 = array [0..3] of Char; | TOldString4 = array [0..3] of Char; | ||
Line 63: | Line 63: | ||
===Динамический символьный массив=== | ===Динамический символьный массив=== | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
var | var | ||
aOldString: Array of Char; | aOldString: Array of Char; | ||
Line 84: | Line 84: | ||
== PChar == | == PChar == | ||
− | Переменные типа '''PChar''' являются указателями на '''Char''', а также позволяют дополнительные действия. | + | Переменные типа '''[[PChar]]''' являются указателями на '''Char''', а также позволяют дополнительные действия. |
Они могут быть использованы для доступа к [http://ru.wikipedia.org/wiki/Нуль-терминированная_строка нуль-терминированным строкам] в стиле C, например, для взаимодействия с библиотеками ОС или сторонними программами. | Они могут быть использованы для доступа к [http://ru.wikipedia.org/wiki/Нуль-терминированная_строка нуль-терминированным строкам] в стиле C, например, для взаимодействия с библиотеками ОС или сторонними программами. | ||
Line 95: | Line 95: | ||
==== Ссылки ==== | ==== Ссылки ==== | ||
− | * [http://www.freepascal.org/docs-html/ref/ | + | * [http://www.freepascal.org/docs-html/ref/refsu12.html PChar в документации FPC] |
* [[doc:rtl/sysutils/pcharfunctions.html|Функции для PChar]] | * [[doc:rtl/sysutils/pcharfunctions.html|Функции для PChar]] | ||
Line 118: | Line 118: | ||
==== Ссылки ==== | ==== Ссылки ==== | ||
− | * [[String| | + | * [[String|Использование String]] |
* [[doc:rtl/sysutils/stringfunctions.html|Строковые функции]] | * [[doc:rtl/sysutils/stringfunctions.html|Строковые функции]] | ||
* [[doc:rtl/strutils/index-5.html|Справка по модулю 'strutils': Процедуры и функции]] | * [[doc:rtl/strutils/index-5.html|Справка по модулю 'strutils': Процедуры и функции]] | ||
Line 124: | Line 124: | ||
== ShortString == | == ShortString == | ||
− | Максимальная длина коротких строк не | + | Максимальная длина коротких строк не превышает 255 символов в [[FPC Unicode support#Codepages|кодовой странице]] CP_ACP. Длина хранится в символе с индексом 0. |
{| class="wikitable" style="text-align:center; width:100px" | {| class="wikitable" style="text-align:center; width:100px" | ||
Line 132: | Line 132: | ||
==== Ссылки ==== | ==== Ссылки ==== | ||
− | * [[doc:ref/refsu12.html|FPC | + | * [[doc:ref/refsu12.html|AnsiString в документации FPC]] |
== AnsiString == | == AnsiString == | ||
− | |||
− | |||
AnsiString является строкой без ограничения длины, с [http://ru.wikipedia.org/wiki/Подсчёт_ссылок подсчётом ссылок] и гарантированно [http://ru.wikipedia.org/wiki/Нуль-терминированная_строка нуль-терминирована]. | AnsiString является строкой без ограничения длины, с [http://ru.wikipedia.org/wiki/Подсчёт_ссылок подсчётом ссылок] и гарантированно [http://ru.wikipedia.org/wiki/Нуль-терминированная_строка нуль-терминирована]. | ||
+ | Переменная типа '''AnsiString''' устроена как указатель -- фактическое содержимое строки хранится в куче, памяти выделяется по объёму содержимого. | ||
{| class="wikitable" style="text-align:center; width:300px" | {| class="wikitable" style="text-align:center; width:300px" | ||
Line 170: | Line 169: | ||
В FPC 2.6.5 и ранее тип '''UTF8String''' был псевдонимом '''[[#AnsiString|AnsiString]]'''. | В FPC 2.6.5 и ранее тип '''UTF8String''' был псевдонимом '''[[#AnsiString|AnsiString]]'''. | ||
В FPC 2.7.1 и далее он определён как | В FPC 2.7.1 и далее он определён как | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
UTF8String = type AnsiString(CP_UTF8); | UTF8String = type AnsiString(CP_UTF8); | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Line 291: | Line 290: | ||
*Системная КС = 8-битная системная кодовая страница ОС. Например, [http://ru.wikipedia.org/wiki/Windows-1251 1251]. | *Системная КС = 8-битная системная кодовая страница ОС. Например, [http://ru.wikipedia.org/wiki/Windows-1251 1251]. | ||
− | <syntaxhighlight> | + | <syntaxhighlight lang="pascal"> |
const | const | ||
c='ãü'; | c='ãü'; | ||
Line 312: | Line 311: | ||
* [[TStringList-TStrings Tutorial/ru|Пособие по TStringList-TStrings]] | * [[TStringList-TStrings Tutorial/ru|Пособие по TStringList-TStrings]] | ||
* [http://www.codexterity.com/delphistrings.htm Краткая история String] | * [http://www.codexterity.com/delphistrings.htm Краткая история String] | ||
− | |||
− | |||
− | |||
− | |||
− |
Latest revision as of 14:49, 3 September 2020
│
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;