Sign in Join
Wiki copytemporary

Character and string types/ru: what changed

Revision 1 to 2. 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-<table>
133132<tbody>
134-<tr>
135-<td style="width: 8%;"></td>
136-<td style="width: 8%;"></td>
137-<td style="width: 8%;"></td>
138-<td style="width: 8%;"></td>
139-<td style="width: 8%;"></td>
140-<td style="width: 8%;"></td>
141-<td style="width: 8%;"></td>
142-<td style="width: 8%;"></td>
143-<td style="width: 8%;">a</td>
144-<td style="width: 8%;">b</td>
145-<td style="width: 8%;">c</td>
146-<td style="width: 8%;">#0</td>
147-</tr>
148-<tr>
149-<td colspan="4" style="width: 16%;">RefCount</td>
150-<td colspan="4" style="width: 16%;">Length</td>
151-<td></td>
152-<td></td>
153-<td></td>
154-<td></td>
155-</tr>
133+
156134</tbody>
157-</table>
158135
159136#### Ссылки
160137
161138- [AnsiString в документации FPC](http://www.freepascal.org/docs-html/ref/refsu12.html)
162139
163140## UnicodeString
164141
165142**UnicodeStrings** как и **AnsiStrings** использует подсчет ссылок и завершение нулём, но реализованы как массивы из **WideChar**, а не обычных **Char**.
166143
167144> **Note:** Вероятно, название UnicodeString двусмысленно из-за его применения в Delphi для Windows, использующей кодировку UTF-16; но это не единственный строковый тип, способный хранить юникодные строки (см. также UTF8String)...
168145
169-<table>
170146<tbody>
171-<tr>
172-<td style="width: 7%;"></td>
173-<td style="width: 7%;"></td>
174-<td style="width: 7%;"></td>
175-<td style="width: 7%;"></td>
176-<td style="width: 7%;"></td>
177-<td style="width: 7%;"></td>
178-<td style="width: 7%;"></td>
179-<td style="width: 7%;"></td>
180-<td style="width: 7%;"></td>
181-<td style="width: 7%;">a</td>
182-<td style="width: 7%;"></td>
183-<td style="width: 7%;">b</td>
184-<td style="width: 7%;"></td>
185-<td style="width: 7%;">c</td>
186-<td style="width: 7%;">#0</td>
187-<td style="width: 7%;">#0</td>
188-</tr>
189-<tr>
190-<td colspan="4" style="width: 16%;">RefCount</td>
191-<td colspan="4" style="width: 16%;">Length</td>
192-<td></td>
193-<td></td>
194-<td></td>
195-<td></td>
196-<td></td>
197-<td></td>
198-<td></td>
199-<td></td>
200-</tr>
147+
201148</tbody>
202-</table>
203149
204150#### Ссылки
205151
206152- [UnicodeString в документации FPC](http://www.freepascal.org/docs-html/ref/refsu13.html)
207153
208154## UTF8String
209155
210156В FPC 2.6.5 и ранее тип **UTF8String** был псевдонимом **AnsiString**. В FPC 2.7.1 и далее он определён как
211157
212158``` pascal
213159UTF8String = type AnsiString(CP_UTF8);
214160```
215161
216162Он предназначен для хранения строк в UTF-8 (в юникоде), от 1 до 4 байт на символ. Заметьте, **String** тоже может содержать символы в кодировке UTF-8.
217163
218164#### Ссылки
219165
220166- [[doc:rtl/system/utf8string.html|UTF8String в документации RTL]]
221167
222168## UTF16String
223169
224170Тип **UTF16String** является псевдонимом типа **WideString**. В модуле LCL *lclproc* это псевдоним для **UnicodeString**.
225171
226172#### Ссылки
227173
228174- [[doc:lcl/lclproc/utf16string.html|UTF16String в документации LCL]]
229175
230176## WideString
231177
232178Тип **[[Widestrings|WideString]]** (используется для представления юникодных строк в приложениях COM) похож на **UnicodeString**, но в отличие от него не использует подсчёт ссылок. Под Windows переменные этого типа распределяются специальными функциями системы, что позволяет использовать из для автоматизации OLE.
233179
234180Широкие строки под Windows состоят из совместимых с COM и закодированных в UTF-16 (UCS2 под Windows 2000) байт, под Linux, Mac OS X и iOS они кодируются в обычный UTF-16.
235181
236-<table>
237182<tbody>
238-<tr>
239-<td style="width: 8%;"></td>
240-<td style="width: 8%;"></td>
241-<td style="width: 8%;"></td>
242-<td style="width: 8%;"></td>
243-<td style="width: 8%;"></td>
244-<td style="width: 8%;">a</td>
245-<td style="width: 8%;"></td>
246-<td style="width: 8%;">b</td>
247-<td style="width: 8%;"></td>
248-<td style="width: 8%;">c</td>
249-<td style="width: 8%;">#0</td>
250-<td style="width: 8%;">#0</td>
251-</tr>
252-<tr>
253-<td colspan="4" style="width: 16%;">Length</td>
254-<td></td>
255-<td></td>
256-<td></td>
257-<td></td>
258-<td></td>
259-<td></td>
260-<td></td>
261-<td></td>
262-</tr>
183+
263184</tbody>
264-</table>
265185
266186#### Ссылки
267187
268188- [WideString в документации FPC](http://www.freepascal.org/docs-html/ref/refsu14.html#x37-400003.2.8)
269189
270190## PShortString
271191
272192Переменная типа **PShortString** является указателем на первый байт переменной типа **ShortString** (содержащий длину строки).
273193
274194| | | | |
275195|-----|-----|-----|-----|
276196| \#3 | a | b | c |
277197| ^ | | | |
278198
279199#### Ссылки
280200
281201- [[doc:rtl/system/pshortstring.html|PShortString в документации RTL]]
282202
283203## PAnsiString
284204
285205Переменные типа **PAnsiString** являются указателями на переменные типа **AnsiString**. Однако, в отличие от переменных типа **PShortString**, они указывают не на первый байт заголовка, а на первый символ **Char** из **AnsiString**.
286206
287-<table>
288207<tbody>
289-<tr>
290-<td style="width: 8%;"></td>
291-<td style="width: 8%;"></td>
292-<td style="width: 8%;"></td>
293-<td style="width: 8%;"></td>
294-<td style="width: 8%;"></td>
295-<td style="width: 8%;"></td>
296-<td style="width: 8%;"></td>
297-<td style="width: 8%;"></td>
298-<td style="width: 8%;">a</td>
299-<td style="width: 8%;">b</td>
300-<td style="width: 8%;">c</td>
301-<td style="width: 8%;">#0</td>
302-</tr>
303-<tr>
304-<td colspan="4" style="width: 16%;">RefCount</td>
305-<td colspan="4" style="width: 16%;">Length</td>
306-<td style="width: 8%;">^</td>
307-<td></td>
308-<td></td>
309-<td></td>
310-</tr>
208+
311209</tbody>
312-</table>
313210
314211#### Ссылки
315212
316213- [[doc:rtl/system/pansistring.html|PAnsiString в документации RTL]]
317214
318215## PUnicodeString
319216
320217Переменные типа **PUnicodeString** являются указателями на переменные типа **UnicodeString**.
321218
322-<table>
323219<tbody>
324-<tr>
325-<td style="width: 7%;"></td>
326-<td style="width: 7%;"></td>
327-<td style="width: 7%;"></td>
328-<td style="width: 7%;"></td>
329-<td style="width: 7%;"></td>
330-<td style="width: 7%;"></td>
331-<td style="width: 7%;"></td>
332-<td style="width: 7%;"></td>
333-<td style="width: 7%;"></td>
334-<td style="width: 7%;">a</td>
335-<td style="width: 7%;"></td>
336-<td style="width: 7%;">b</td>
337-<td style="width: 7%;"></td>
338-<td style="width: 7%;">c</td>
339-<td style="width: 7%;">#0</td>
340-<td style="width: 7%;">#0</td>
341-</tr>
342-<tr>
343-<td colspan="4" style="width: 16%;">RefCount</td>
344-<td colspan="4" style="width: 16%;">Length</td>
345-<td style="width: 7%;">^</td>
346-<td></td>
347-<td></td>
348-<td></td>
349-<td></td>
350-<td></td>
351-<td></td>
352-<td></td>
353-</tr>
220+
354221</tbody>
355-</table>
356222
357223#### Ссылки
358224
359225- [[doc:rtl/system/punicodestring.html|PUnicodeString в документации RTL]]
360226
361227## PWideString
362228
363229Переменные типа **PWideString** являются указателями. Они указывают на первый символ переменной типа **WideString**.
364230
365-<table>
366231<tbody>
367-<tr>
368-<td style="width: 8%;"></td>
369-<td style="width: 8%;"></td>
370-<td style="width: 8%;"></td>
371-<td style="width: 8%;"></td>
372-<td style="width: 8%;"></td>
373-<td style="width: 8%;">a</td>
374-<td style="width: 8%;"></td>
375-<td style="width: 8%;">b</td>
376-<td style="width: 8%;"></td>
377-<td style="width: 8%;">c</td>
378-<td style="width: 8%;">#0</td>
379-<td style="width: 8%;">#0</td>
380-</tr>
381-<tr>
382-<td colspan="4" style="width: 16%;">Length</td>
383-<td style="width: 8%;">^</td>
384-<td></td>
385-<td></td>
386-<td></td>
387-<td></td>
388-<td></td>
389-<td></td>
390-<td></td>
391-</tr>
232+
392233</tbody>
393-</table>
394234
395235#### Ссылки
396236
397237- [[doc:rtl/system/pwidestring.html|PWideString в документации RTL]]
398238
399239## Строковые константы
400240
401241Если вы используете только английские константы, такие строки работают одинаково со всеми типами на всех платформах и на всех версиях компилятора. Неанглийские строки могут быть загружены как ResourceString или из файлов. Если вам нужно использовать неанглийские строки в коде, читайте ниже.
402242
403243Для неанглийских строк существует множество кодировок. По умолчанию Лазарус сохраняет файлы как **UTF-8 без [BOM](http://ru.wikipedia.org/wiki/Маркер_последовательности_байтов)**. Кодировка UTF-8 поддерживает все символы юникода. Это означает, что все строковые константы также сохранены в UTF-8. Лазарус также поддерживает смену кодировки файла, например, под Windows можно сохранить файл в локальной кодировке. Кодировки Windows ограничены вашей текущей языковой группой.
404244
405245| Строковый тип, исходник в UTF-8 | С или без {\$codepage utf8} | FPC 2.6.5 и ниже | FPC 2.7.1 и выше | FPC 2.7.1+ с кодовой страницей UTF8 |
406246|----|----|----|----|----|
407247| \|Без | Требует UTF8ToAnsi в RTL/WinAPI. Ок в LCL | Требует UTF8ToAnsi в RTL/WinAPI. Ок в LCL | Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI | |
408248| \|С | Системная КС в RTL/WinAPI ок. Требует SysToUTF8 в LCL | Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС | Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI | |
409249| \|Без | Неверно везде | Неверно везде | Неверно везде | |
410250| \|С | Системная КС в RTL/WinAPI ок. Требует UTF8Encode в LCL | Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС | Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI | |
411251| \|Без | Как AnsiString | Неверно везде | Неверно везде | |
412252| \|С | Как AnsiString | Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС | Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI | |
413253
414254- W-WinAPI = функции Windows API с "W", UTF-16
415255- A-WinAPI = функции Windows API без "W", 8-битная кодовая страница
416256- Системная КС = 8-битная системная кодовая страница ОС. Например, [1251](http://ru.wikipedia.org/wiki/Windows-1251).
417257
418258``` pascal
419259const
420260 c='ãü';
421261 cstring: string = 'ãü'; // см. AnAnsiString:='ãü';
422262var
423263 s: string;
424264 u: UnicodeString;
425265begin
426266 s:=c; // то же, что s:='ãü';
427267 s:=cstring; // не изменяет кодировку
428268 u:=c; // то же, что u:='ãü';
429269 u:=cstring; // fpc 2.6.1: преобразует из системной КС в UTF-16,
430270 // fpc 2.7.1+: зависит от кодировки cstring
431271end;
432272```
433273
434274## См. также
435275
436276- [[FPC Unicode support/ru|Поддержка юникода в FPC]]
437277- [[LCL Unicode Support/ru|Поддержка юникода в LCL]]
438278- [[TStringList-TStrings Tutorial/ru|Пособие по TStringList-TStrings]]
439279- [Краткая история String](http://www.codexterity.com/delphistrings.htm)
440280
441281---
442282*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