Sign in Join
Wiki copytemporary

Character and string types/ru: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Free Pascal поддерживает несколько **[[Char|символьных]] и [[String|строковых]] типов**, от одиночных символов ANSI до юникодных строк, включая указатели. Различия также касаются кодировок и подсчёта ссылок.
22
33## AnsiChar
44
55Переменная типа **AnsiChar**, называемого также **[[Char]]**, имеет размер ровно 1 байт и содержит один символ ANSI.
66
77| |
88|-----|
99| a |
1010
1111#### Ссылки
1212
1313- [AnsiChar в документации FPC](http://www.freepascal.org/docs-html/ref/refsu6.html)
1414- [[Char|Использование Char]]
1515
1616## WideChar
1717
1818Переменная типа **WideChar**, называемого также **UnicodeChar**, имеет размер ровно 2 байта и обычно содержит одну [[LCL Unicode Support/ru|юникодную]] кодовую точку (обычно один символ) в кодировке UTF-16. Примечание: все юникодные кодовые точки закодировать 2-я байтами невозможно. Поэтому для представления одной кодовой точки может потребоваться пара WideChar.
1919
2020| | |
2121|-----|-----|
2222| | a |
2323
2424#### Ссылки
2525
2626- [WideChar в документации FPC](http://www.freepascal.org/docs-html/ref/refsu7.html)
2727- [Сведения об UTF-16 в Wikipedia](http://ru.wikipedia.org/wiki/UTF-16)
2828- [[doc:rtl/system/unicodechar.html|UnicodeChar в документации RTL]]
2929
3030## Символьный массив
3131
3232Ранние реализации языка Паскаль, использовавшиеся до 1978 года, не поддерживали строковый тип (за исключением строковых констант). Единственной возможностью сохранять строки в переменных было использование массивов символов. Этот подход имеет множество недостатков и более не рекомендуется. Тем не менее, он по-прежнему поддерживается для обеспечения обратной совместимости с устаревшим кодом.
3333
3434### Статический символьный массив
3535
3636``` pascal
3737type
3838 TOldString4 = array [0..3] of Char;
3939var
4040 aOldString4: TOldString4;
4141begin
4242 aOldString4[0] := 'a';
4343 aOldString4[1] := 'b';
4444 aOldString4[2] := 'c';
4545 aOldString4[3] := 'd';
4646end;
4747```
4848
4949Статический символьный массив теперь содержит:
5050
5151| | | | |
5252|-----|-----|-----|-----|
5353| a | b | c | d |
5454
5555> **Note:** Неинициализированные символы могут иметь любые значения, которые зависят от содержимого памяти при её выделении под массив.
5656
5757### Динамический символьный массив
5858
5959``` pascal
6060var
6161 aOldString: Array of Char;
6262begin
6363 SetLength(aOldString, 5);
6464 aOldString[0] := 'a';
6565 aOldString[1] := 'b';
6666 aOldString[2] := 'c';
6767 aOldString[3] := 'd';
6868end;
6969```
7070
7171Динамический символьный массив теперь содержит:
7272
7373| | | | | |
7474|-----|-----|-----|-----|-----|
7575| a | b | c | d | \#0 |
7676
7777> **Note:** Неинициализированные символы динамического массива содержат \#0, поскольку содержимое динамического массива изначально инициализируется 0 (или \#0, или nil, или ...)
7878
7979## PChar
8080
8181Переменные типа **[[PChar]]** являются указателями на **Char**, а также позволяют дополнительные действия. Они могут быть использованы для доступа к [нуль-терминированным строкам](http://ru.wikipedia.org/wiki/Нуль-терминированная_строка) в стиле C, например, для взаимодействия с библиотеками ОС или сторонними программами.
8282
8383| | | | |
8484|-----|-----|-----|-----|
8585| a | b | c | \#0 |
8686| ^ | | | |
8787
8888#### Ссылки
8989
9090- [PChar в документации FPC](http://www.freepascal.org/docs-html/ref/refsu12.html)
9191- [[doc:rtl/sysutils/pcharfunctions.html|Функции для PChar]]
9292
9393## PWideChar
9494
9595Переменная типа **PWideChar** является указателем на WideChar.
9696
9797| | | | | | | | |
9898|-----|-----|-----|-----|-----|-----|-----|-----|
9999| | a | | b | | c | \#0 | \#0 |
100100| ^ | | | | | | | |
101101
102102#### Ссылки
103103
104104- [[doc:rtl/system/pwidechar.html|PWideChar в документации RTL]]
105105
106106## String
107107
108108Тип **String** может означать **ShortString** или **AnsiString**, в зависимости от [опции {\$H}](http://www.freepascal.org/docs-html/prog/progsu25.html#x32-310001.2.25). Когда опция выключена ({\$H-}), String означает **ShortString** (короткая строка). Если не указано иное, её размер 255 символов. Когда опция включена ({\$H+}), **String** без указания длины означает **AnsiString**, в противном случае -- **ShortString** заданной длины. В режиме **{\$mode DelphiUnicode}** **String** означает **UnicodeString**.
109109
110110#### Ссылки
111111
112112- [[String|Использование String]]
113113- [[doc:rtl/sysutils/stringfunctions.html|Строковые функции]]
114114- [[doc:rtl/strutils/index-5.html|Справка по модулю 'strutils': Процедуры и функции]]
115115
116116## ShortString
117117
118118Максимальная длина коротких строк не превышает 255 символов в [[FPC Unicode support|кодовой странице]] CP_ACP. Длина хранится в символе с индексом 0.
119119
120120| | | | |
121121|-----|-----|-----|-----|
122122| \#3 | a | b | c |
123123
124124#### Ссылки
125125
126126- [[doc:ref/refsu12.html|AnsiString в документации FPC]]
127127
128128## AnsiString
129129
130130AnsiString является строкой без ограничения длины, с [подсчётом ссылок](http://ru.wikipedia.org/wiki/Подсчёт_ссылок) и гарантированно [нуль-терминирована](http://ru.wikipedia.org/wiki/Нуль-терминированная_строка). Переменная типа **AnsiString** устроена как указатель -- фактическое содержимое строки хранится в куче, памяти выделяется по объёму содержимого.
131131
132-<tbody>
133-
134-</tbody>
132+| | | | | | | | | a | b | c | #0 |
133+|---|---|---|---|---|---|---|---|---|---|---|---|
134+| RefCount | | | | Length | | | | | | | |
135135
136136#### Ссылки
137137
138138- [AnsiString в документации FPC](http://www.freepascal.org/docs-html/ref/refsu12.html)
139139
140140## UnicodeString
141141
142142**UnicodeStrings** как и **AnsiStrings** использует подсчет ссылок и завершение нулём, но реализованы как массивы из **WideChar**, а не обычных **Char**.
143143
144144> **Note:** Вероятно, название UnicodeString двусмысленно из-за его применения в Delphi для Windows, использующей кодировку UTF-16; но это не единственный строковый тип, способный хранить юникодные строки (см. также UTF8String)...
145145
146-<tbody>
147-
148-</tbody>
146+| | | | | | | | | | a | | b | | c | #0 | #0 |
147+|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
148+| RefCount | | | | Length | | | | | | | | | | | |
149149
150150#### Ссылки
151151
152152- [UnicodeString в документации FPC](http://www.freepascal.org/docs-html/ref/refsu13.html)
153153
154154## UTF8String
155155
156156В FPC 2.6.5 и ранее тип **UTF8String** был псевдонимом **AnsiString**. В FPC 2.7.1 и далее он определён как
157157
158158``` pascal
159159UTF8String = type AnsiString(CP_UTF8);
160160```
161161
162162Он предназначен для хранения строк в UTF-8 (в юникоде), от 1 до 4 байт на символ. Заметьте, **String** тоже может содержать символы в кодировке UTF-8.
163163
164164#### Ссылки
165165
166166- [[doc:rtl/system/utf8string.html|UTF8String в документации RTL]]
167167
168168## UTF16String
169169
170170Тип **UTF16String** является псевдонимом типа **WideString**. В модуле LCL *lclproc* это псевдоним для **UnicodeString**.
171171
172172#### Ссылки
173173
174174- [[doc:lcl/lclproc/utf16string.html|UTF16String в документации LCL]]
175175
176176## WideString
177177
178178Тип **[[Widestrings|WideString]]** (используется для представления юникодных строк в приложениях COM) похож на **UnicodeString**, но в отличие от него не использует подсчёт ссылок. Под Windows переменные этого типа распределяются специальными функциями системы, что позволяет использовать из для автоматизации OLE.
179179
180180Широкие строки под Windows состоят из совместимых с COM и закодированных в UTF-16 (UCS2 под Windows 2000) байт, под Linux, Mac OS X и iOS они кодируются в обычный UTF-16.
181181
182-<tbody>
183-
184-</tbody>
182+| | | | | | a | | b | | c | #0 | #0 |
183+|---|---|---|---|---|---|---|---|---|---|---|---|
184+| Length | | | | | | | | | | | |
185185
186186#### Ссылки
187187
188188- [WideString в документации FPC](http://www.freepascal.org/docs-html/ref/refsu14.html#x37-400003.2.8)
189189
190190## PShortString
191191
192192Переменная типа **PShortString** является указателем на первый байт переменной типа **ShortString** (содержащий длину строки).
193193
194194| | | | |
195195|-----|-----|-----|-----|
196196| \#3 | a | b | c |
197197| ^ | | | |
198198
199199#### Ссылки
200200
201201- [[doc:rtl/system/pshortstring.html|PShortString в документации RTL]]
202202
203203## PAnsiString
204204
205205Переменные типа **PAnsiString** являются указателями на переменные типа **AnsiString**. Однако, в отличие от переменных типа **PShortString**, они указывают не на первый байт заголовка, а на первый символ **Char** из **AnsiString**.
206206
207-<tbody>
208-
209-</tbody>
207+| | | | | | | | | a | b | c | #0 |
208+|---|---|---|---|---|---|---|---|---|---|---|---|
209+| RefCount | | | | Length | | | | ^ | | | |
210210
211211#### Ссылки
212212
213213- [[doc:rtl/system/pansistring.html|PAnsiString в документации RTL]]
214214
215215## PUnicodeString
216216
217217Переменные типа **PUnicodeString** являются указателями на переменные типа **UnicodeString**.
218218
219-<tbody>
220-
221-</tbody>
219+| | | | | | | | | | a | | b | | c | #0 | #0 |
220+|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
221+| RefCount | | | | Length | | | | ^ | | | | | | | |
222222
223223#### Ссылки
224224
225225- [[doc:rtl/system/punicodestring.html|PUnicodeString в документации RTL]]
226226
227227## PWideString
228228
229229Переменные типа **PWideString** являются указателями. Они указывают на первый символ переменной типа **WideString**.
230230
231-<tbody>
232-
233-</tbody>
231+| | | | | | a | | b | | c | #0 | #0 |
232+|---|---|---|---|---|---|---|---|---|---|---|---|
233+| Length | | | | ^ | | | | | | | |
234234
235235#### Ссылки
236236
237237- [[doc:rtl/system/pwidestring.html|PWideString в документации RTL]]
238238
239239## Строковые константы
240240
241241Если вы используете только английские константы, такие строки работают одинаково со всеми типами на всех платформах и на всех версиях компилятора. Неанглийские строки могут быть загружены как ResourceString или из файлов. Если вам нужно использовать неанглийские строки в коде, читайте ниже.
242242
243243Для неанглийских строк существует множество кодировок. По умолчанию Лазарус сохраняет файлы как **UTF-8 без [BOM](http://ru.wikipedia.org/wiki/Маркер_последовательности_байтов)**. Кодировка UTF-8 поддерживает все символы юникода. Это означает, что все строковые константы также сохранены в UTF-8. Лазарус также поддерживает смену кодировки файла, например, под Windows можно сохранить файл в локальной кодировке. Кодировки Windows ограничены вашей текущей языковой группой.
244244
245245| Строковый тип, исходник в UTF-8 | С или без {\$codepage utf8} | FPC 2.6.5 и ниже | FPC 2.7.1 и выше | FPC 2.7.1+ с кодовой страницей UTF8 |
246246|----|----|----|----|----|
247247| \|Без | Требует UTF8ToAnsi в RTL/WinAPI. Ок в LCL | Требует UTF8ToAnsi в RTL/WinAPI. Ок в LCL | Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI | |
248248| \|С | Системная КС в RTL/WinAPI ок. Требует SysToUTF8 в LCL | Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС | Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI | |
249249| \|Без | Неверно везде | Неверно везде | Неверно везде | |
250250| \|С | Системная КС в RTL/WinAPI ок. Требует UTF8Encode в LCL | Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС | Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI | |
251251| \|Без | Как AnsiString | Неверно везде | Неверно везде | |
252252| \|С | Как AnsiString | Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС | Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI | |
253253
254254- W-WinAPI = функции Windows API с "W", UTF-16
255255- A-WinAPI = функции Windows API без "W", 8-битная кодовая страница
256256- Системная КС = 8-битная системная кодовая страница ОС. Например, [1251](http://ru.wikipedia.org/wiki/Windows-1251).
257257
258258``` pascal
259259const
260260 c='ãü';
261261 cstring: string = 'ãü'; // см. AnAnsiString:='ãü';
262262var
263263 s: string;
264264 u: UnicodeString;
265265begin
266266 s:=c; // то же, что s:='ãü';
267267 s:=cstring; // не изменяет кодировку
268268 u:=c; // то же, что u:='ãü';
269269 u:=cstring; // fpc 2.6.1: преобразует из системной КС в UTF-16,
270270 // fpc 2.7.1+: зависит от кодировки cstring
271271end;
272272```
273273
274274## См. также
275275
276276- [[FPC Unicode support/ru|Поддержка юникода в FPC]]
277277- [[LCL Unicode Support/ru|Поддержка юникода в LCL]]
278278- [[TStringList-TStrings Tutorial/ru|Пособие по TStringList-TStrings]]
279279- [Краткая история String](http://www.codexterity.com/delphistrings.htm)
280280
281281---
282282*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](/wiki-contact).*

Back to history