Sign in Join
Wiki copytemporary

Character and string types/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: Character and string types/ru

OldNewLine
1+Free Pascal поддерживает несколько **[[Char|символьных]] и [[String|строковых]] типов**, от одиночных символов ANSI до юникодных строк, включая указатели. Различия также касаются кодировок и подсчёта ссылок.
2+
3+## AnsiChar
4+
5+Переменная типа **AnsiChar**, называемого также **[[Char]]**, имеет размер ровно 1 байт и содержит один символ ANSI.
6+
7+| |
8+|-----|
9+| a |
10+
11+#### Ссылки
12+
13+- [AnsiChar в документации FPC](http://www.freepascal.org/docs-html/ref/refsu6.html)
14+- [[Char|Использование Char]]
15+
16+## WideChar
17+
18+Переменная типа **WideChar**, называемого также **UnicodeChar**, имеет размер ровно 2 байта и обычно содержит одну [[LCL Unicode Support/ru|юникодную]] кодовую точку (обычно один символ) в кодировке UTF-16. Примечание: все юникодные кодовые точки закодировать 2-я байтами невозможно. Поэтому для представления одной кодовой точки может потребоваться пара WideChar.
19+
20+| | |
21+|-----|-----|
22+| | a |
23+
24+#### Ссылки
25+
26+- [WideChar в документации FPC](http://www.freepascal.org/docs-html/ref/refsu7.html)
27+- [Сведения об UTF-16 в Wikipedia](http://ru.wikipedia.org/wiki/UTF-16)
28+- [[doc:rtl/system/unicodechar.html|UnicodeChar в документации RTL]]
29+
30+## Символьный массив
31+
32+Ранние реализации языка Паскаль, использовавшиеся до 1978 года, не поддерживали строковый тип (за исключением строковых констант). Единственной возможностью сохранять строки в переменных было использование массивов символов. Этот подход имеет множество недостатков и более не рекомендуется. Тем не менее, он по-прежнему поддерживается для обеспечения обратной совместимости с устаревшим кодом.
33+
34+### Статический символьный массив
35+
36+``` pascal
37+type
38+ TOldString4 = array [0..3] of Char;
39+var
40+ aOldString4: TOldString4;
41+begin
42+ aOldString4[0] := 'a';
43+ aOldString4[1] := 'b';
44+ aOldString4[2] := 'c';
45+ aOldString4[3] := 'd';
46+end;
47+```
48+
49+Статический символьный массив теперь содержит:
50+
51+| | | | |
52+|-----|-----|-----|-----|
53+| a | b | c | d |
54+
55+> **Note:** Неинициализированные символы могут иметь любые значения, которые зависят от содержимого памяти при её выделении под массив.
56+
57+### Динамический символьный массив
58+
59+``` pascal
60+var
61+ aOldString: Array of Char;
62+begin
63+ SetLength(aOldString, 5);
64+ aOldString[0] := 'a';
65+ aOldString[1] := 'b';
66+ aOldString[2] := 'c';
67+ aOldString[3] := 'd';
68+end;
69+```
70+
71+Динамический символьный массив теперь содержит:
72+
73+| | | | | |
74+|-----|-----|-----|-----|-----|
75+| a | b | c | d | \#0 |
76+
77+> **Note:** Неинициализированные символы динамического массива содержат \#0, поскольку содержимое динамического массива изначально инициализируется 0 (или \#0, или nil, или ...)
78+
79+## PChar
80+
81+Переменные типа **[[PChar]]** являются указателями на **Char**, а также позволяют дополнительные действия. Они могут быть использованы для доступа к [нуль-терминированным строкам](http://ru.wikipedia.org/wiki/Нуль-терминированная_строка) в стиле C, например, для взаимодействия с библиотеками ОС или сторонними программами.
82+
83+| | | | |
84+|-----|-----|-----|-----|
85+| a | b | c | \#0 |
86+| ^ | | | |
87+
88+#### Ссылки
89+
90+- [PChar в документации FPC](http://www.freepascal.org/docs-html/ref/refsu12.html)
91+- [[doc:rtl/sysutils/pcharfunctions.html|Функции для PChar]]
92+
93+## PWideChar
94+
95+Переменная типа **PWideChar** является указателем на WideChar.
96+
97+| | | | | | | | |
98+|-----|-----|-----|-----|-----|-----|-----|-----|
99+| | a | | b | | c | \#0 | \#0 |
100+| ^ | | | | | | | |
101+
102+#### Ссылки
103+
104+- [[doc:rtl/system/pwidechar.html|PWideChar в документации RTL]]
105+
106+## String
107+
108+Тип **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**.
109+
110+#### Ссылки
111+
112+- [[String|Использование String]]
113+- [[doc:rtl/sysutils/stringfunctions.html|Строковые функции]]
114+- [[doc:rtl/strutils/index-5.html|Справка по модулю 'strutils': Процедуры и функции]]
115+
116+## ShortString
117+
118+Максимальная длина коротких строк не превышает 255 символов в [[FPC Unicode support|кодовой странице]] CP_ACP. Длина хранится в символе с индексом 0.
119+
120+| | | | |
121+|-----|-----|-----|-----|
122+| \#3 | a | b | c |
123+
124+#### Ссылки
125+
126+- [[doc:ref/refsu12.html|AnsiString в документации FPC]]
127+
128+## AnsiString
129+
130+AnsiString является строкой без ограничения длины, с [подсчётом ссылок](http://ru.wikipedia.org/wiki/Подсчёт_ссылок) и гарантированно [нуль-терминирована](http://ru.wikipedia.org/wiki/Нуль-терминированная_строка). Переменная типа **AnsiString** устроена как указатель -- фактическое содержимое строки хранится в куче, памяти выделяется по объёму содержимого.
131+
132+<table>
133+<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>
156+</tbody>
157+</table>
158+
159+#### Ссылки
160+
161+- [AnsiString в документации FPC](http://www.freepascal.org/docs-html/ref/refsu12.html)
162+
163+## UnicodeString
164+
165+**UnicodeStrings** как и **AnsiStrings** использует подсчет ссылок и завершение нулём, но реализованы как массивы из **WideChar**, а не обычных **Char**.
166+
167+> **Note:** Вероятно, название UnicodeString двусмысленно из-за его применения в Delphi для Windows, использующей кодировку UTF-16; но это не единственный строковый тип, способный хранить юникодные строки (см. также UTF8String)...
168+
169+<table>
170+<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>
201+</tbody>
202+</table>
203+
204+#### Ссылки
205+
206+- [UnicodeString в документации FPC](http://www.freepascal.org/docs-html/ref/refsu13.html)
207+
208+## UTF8String
209+
210+В FPC 2.6.5 и ранее тип **UTF8String** был псевдонимом **AnsiString**. В FPC 2.7.1 и далее он определён как
211+
212+``` pascal
213+UTF8String = type AnsiString(CP_UTF8);
214+```
215+
216+Он предназначен для хранения строк в UTF-8 (в юникоде), от 1 до 4 байт на символ. Заметьте, **String** тоже может содержать символы в кодировке UTF-8.
217+
218+#### Ссылки
219+
220+- [[doc:rtl/system/utf8string.html|UTF8String в документации RTL]]
221+
222+## UTF16String
223+
224+Тип **UTF16String** является псевдонимом типа **WideString**. В модуле LCL *lclproc* это псевдоним для **UnicodeString**.
225+
226+#### Ссылки
227+
228+- [[doc:lcl/lclproc/utf16string.html|UTF16String в документации LCL]]
229+
230+## WideString
231+
232+Тип **[[Widestrings|WideString]]** (используется для представления юникодных строк в приложениях COM) похож на **UnicodeString**, но в отличие от него не использует подсчёт ссылок. Под Windows переменные этого типа распределяются специальными функциями системы, что позволяет использовать из для автоматизации OLE.
233+
234+Широкие строки под Windows состоят из совместимых с COM и закодированных в UTF-16 (UCS2 под Windows 2000) байт, под Linux, Mac OS X и iOS они кодируются в обычный UTF-16.
235+
236+<table>
237+<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>
263+</tbody>
264+</table>
265+
266+#### Ссылки
267+
268+- [WideString в документации FPC](http://www.freepascal.org/docs-html/ref/refsu14.html#x37-400003.2.8)
269+
270+## PShortString
271+
272+Переменная типа **PShortString** является указателем на первый байт переменной типа **ShortString** (содержащий длину строки).
273+
274+| | | | |
275+|-----|-----|-----|-----|
276+| \#3 | a | b | c |
277+| ^ | | | |
278+
279+#### Ссылки
280+
281+- [[doc:rtl/system/pshortstring.html|PShortString в документации RTL]]
282+
283+## PAnsiString
284+
285+Переменные типа **PAnsiString** являются указателями на переменные типа **AnsiString**. Однако, в отличие от переменных типа **PShortString**, они указывают не на первый байт заголовка, а на первый символ **Char** из **AnsiString**.
286+
287+<table>
288+<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>
311+</tbody>
312+</table>
313+
314+#### Ссылки
315+
316+- [[doc:rtl/system/pansistring.html|PAnsiString в документации RTL]]
317+
318+## PUnicodeString
319+
320+Переменные типа **PUnicodeString** являются указателями на переменные типа **UnicodeString**.
321+
322+<table>
323+<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>
354+</tbody>
355+</table>
356+
357+#### Ссылки
358+
359+- [[doc:rtl/system/punicodestring.html|PUnicodeString в документации RTL]]
360+
361+## PWideString
362+
363+Переменные типа **PWideString** являются указателями. Они указывают на первый символ переменной типа **WideString**.
364+
365+<table>
366+<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>
392+</tbody>
393+</table>
394+
395+#### Ссылки
396+
397+- [[doc:rtl/system/pwidestring.html|PWideString в документации RTL]]
398+
399+## Строковые константы
400+
401+Если вы используете только английские константы, такие строки работают одинаково со всеми типами на всех платформах и на всех версиях компилятора. Неанглийские строки могут быть загружены как ResourceString или из файлов. Если вам нужно использовать неанглийские строки в коде, читайте ниже.
402+
403+Для неанглийских строк существует множество кодировок. По умолчанию Лазарус сохраняет файлы как **UTF-8 без [BOM](http://ru.wikipedia.org/wiki/Маркер_последовательности_байтов)**. Кодировка UTF-8 поддерживает все символы юникода. Это означает, что все строковые константы также сохранены в UTF-8. Лазарус также поддерживает смену кодировки файла, например, под Windows можно сохранить файл в локальной кодировке. Кодировки Windows ограничены вашей текущей языковой группой.
404+
405+| Строковый тип, исходник в UTF-8 | С или без {\$codepage utf8} | FPC 2.6.5 и ниже | FPC 2.7.1 и выше | FPC 2.7.1+ с кодовой страницей UTF8 |
406+|----|----|----|----|----|
407+| \|Без | Требует UTF8ToAnsi в RTL/WinAPI. Ок в LCL | Требует UTF8ToAnsi в RTL/WinAPI. Ок в LCL | Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI | |
408+| \|С | Системная КС в RTL/WinAPI ок. Требует SysToUTF8 в LCL | Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС | Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI | |
409+| \|Без | Неверно везде | Неверно везде | Неверно везде | |
410+| \|С | Системная КС в RTL/WinAPI ок. Требует UTF8Encode в LCL | Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС | Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI | |
411+| \|Без | Как AnsiString | Неверно везде | Неверно везде | |
412+| \|С | Как AnsiString | Ок в RTL/WinAPI/LCL. Смешение с другими строками преобразует в системную КС | Ок в RTL/W-WinAPI/LCL. Требует UTF8ToWinCP в A-WinAPI | |
413+
414+- W-WinAPI = функции Windows API с "W", UTF-16
415+- A-WinAPI = функции Windows API без "W", 8-битная кодовая страница
416+- Системная КС = 8-битная системная кодовая страница ОС. Например, [1251](http://ru.wikipedia.org/wiki/Windows-1251).
417+
418+``` pascal
419+const
420+ c='ãü';
421+ cstring: string = 'ãü'; // см. AnAnsiString:='ãü';
422+var
423+ s: string;
424+ u: UnicodeString;
425+begin
426+ s:=c; // то же, что s:='ãü';
427+ s:=cstring; // не изменяет кодировку
428+ u:=c; // то же, что u:='ãü';
429+ u:=cstring; // fpc 2.6.1: преобразует из системной КС в UTF-16,
430+ // fpc 2.7.1+: зависит от кодировки cstring
431+end;
432+```
433+
434+## См. также
435+
436+- [[FPC Unicode support/ru|Поддержка юникода в FPC]]
437+- [[LCL Unicode Support/ru|Поддержка юникода в LCL]]
438+- [[TStringList-TStrings Tutorial/ru|Пособие по TStringList-TStrings]]
439+- [Краткая история String](http://www.codexterity.com/delphistrings.htm)
440+
441+---
442+*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