Символи и низове

Запознаване със символни и низови типове данни, използване на компоненти за работа с низове.

Понятията "знак" и "низ"

За обикновения потребител тези понятия са много абстрактни. Когато пише "А" на клавиатурата, той го смята за символ, буква. Когато въвеждате "4", това е число. И за всякакви интервали, препинателни знаци или аритметични знаци, той изобщо не мисли. Но програмистът трябва да разбере как всички тези знаци се възприемат от компютъра. Затова бъдете търпеливи, ние ще проучим тези понятия достатъчно подробно.

Всъщност всичко, което въвеждаме от клавиатурата, са символи. Буква "z", цифра "3", интервал, знак за умножение, знак за процент и др. всички са символи. Компютърът, от друга страна, може да работи само с числа и то с двоични - такива, които съдържат само 0 или 1. Всички тези букви, десетични цифри и други знаци не му говорят абсолютно нищо. И за да можем по някакъв начин да обработваме текст, числа и друга информация, беше необходимо да се създаде специална система за превод на информация в удобна за компютъра и обратно. Ето как се появихакодовите страници.

Кодова страница(англ. кодова страница) - специална таблица, която съпоставя всяка байтова стойност с определен знак.

Не е много ясно? Нека да го разберем. Знаем, че информацията се измерва в байтове и че има 8 бита в един байт. Битът е най-малката единица информация, с която компютърът може да работи. Битът може да съхранява 0 или 1.

В зората на развитието на компютрите е разработена кодовата страницаASCII(английскиAmerican Standard Code for Information Interchange- американски кодов стандарт за обмен на информация). Първата версия на този стандарт се появява през 1963 г. Тази страница съдържа 7-битови символи, всекибайт, един бит не е използван. Минималното двоично число, което може да бъде съхранено в 7 бита, е нула. Максимумът е 1111111.

Щракнете върху бутона "Старт", изберете командата "Изпълни" и в прозореца "Изпълнена програма" въведете

и натиснете . Ще се зареди стандартният калкулатор на Windows. В главното меню на програмата в секцията "Изглед" изберете "Инженерство". В лявата част на калкулатора, под полето за въвеждане на числа, ще видите превключватели за различни бройни системи:

низове

Тук имаме възможност да превключим към четири системи за смятане:

  • Hex- шестнадесетичен. Използва се главно в асемблерния език или при отстраняване на грешки в програми.
  • Dec- десетичен знак. Нашата обичайна система, използвана по подразбиране.
  • Oct- осмичен. Почти не е използван.
  • Бин- 2-ар. Въпреки че е единственият разбираем за компютър, поради тромавостта на записите обикновено не се използва в програмирането.

Нека да видим колко знака може да съдържа ASCII кодовата страница. Превключете към двоичен ( Bin ), въведете 7 единици, след което превключете обратно към десетичен ( Dec ). Имаме 127. Това е колко знака се съдържат в първата ASCII таблица. Освен латинските букви таблицата съдържаше и други символи - цифри, аритметични знаци, препинателни знаци, интервали, скоби и др. Всеки символ имаше свой номер в таблицата. Ако въведем английската буква "А", тогава числото на този знак в таблицата попадна в компютъра - 65. Или в двоична форма 100 0001. Така знаците могат да се сравняват един с друг. Английското "B" беше под номер 66 и следователно беше по-голямо от "A". Малките букви имаха различни числа,например "a" беше номер 97 в таблицата и се смяташе за по-голямо от "A". Въвеждаме символи, които автоматично се преобразуват в числа, с които компютърът вече работи.

Тук трябва да се направи едно важно уточнение. Ако въведем числото "65", тогава за компютъра това не беше числото 65 или латинската буква "A", а два знака "6" и "5". Символът "6" отговаря на числото 54 от кодовата таблица, а символът "5" отговаря на числото 53. Така числата, които въвеждаме в компютъра, всъщност не са числа, а текстови знаци! Преобразуването на такива знаци в числа и обратно обикновено се извършва автоматично от програмата. Такива преобразувания например се извършват постоянно от стандартния Windows калкулатор. И когато изучаваме числата, ние самите ще трябва да извършим същите трансформации.

Всичко би било наред, но освен английския, в света има много други езици! Например, ние пишем на кирилица - стилът на българския шрифт. 127 знака явно не бяха достатъчни, за да можете да въвеждате текст на други езици. Следователно ASCII таблицата се разви, нови стандарти се появяват от година на година. Всеки символ е станал 8-битов. Погледнете калкулатора - осем бита могат да съдържат максималното число 1111 1111, когато се преобразуват в десетични, получаваме 255 знака. Първата половина на таблицата остана непроменена, но втората половина на таблицата можеше да се използва за символи от други езици и псевдографики, с които програмистите на MS-DOS рисуваха прозорци, панели, таблици и менюта. Това обаче беше твърде малко за кодиране на символите на всички езици на Земята. За всеки език беше необходимо да се разработи собствен стандарт, несъвместим с другите. Освен това могат да бъдат разработени няколко стандарта за един език! За българския напр.има стандарти CP866 (Кодова страница 866), KOI8-R, KOI8-U, ISO-8859-5 и това са само най-често срещаните! В хаоса на стандартите беше необходимо по някакъв начин да ги разберем, подобрим.

ASCII беше заменен отANSIкодиране (англ.American National Standards Institute- Американски национален институт по стандартизация). И така, в MS Windows кодовата страница ANSI, съдържаща кирилица, е Windows -1251 (или CP1251), която се появява през 1990-1991 г.

Това обаче не беше достатъчно, защото всеки език все още изискваше собствено кодиране, а на Земята има много езици. Има нужда от преминаване към "широки" стандарти, в които символът заема повече от един байт. И така, през 1991 г. беше предложен стандартътUnicode(англ.Unicode) - универсална система за кодиране на знаци, която представлява знаци на почти всички езици. В този стандарт в един документ могат да се използват кирилица, китайски или японски символи, знаци на математически формули, музикални знаци и др.

Първата версия на Unicode имаше фиксиран размер на символа от 2 байта (16 бита). В едно кодиране вече могат да се използват 65 535 знака! Оказа се обаче, че това не е достатъчно. Уникод се разви допълнително, като година след година се появяват нови версии и стандарти, базирани на Уникод. Има такива стандарти катоUTF-8(английскиUnicode Transformation Format, 8 bit - 8-bit Unicode transformation format),UTF-16,UTF-32.

Този подход прави UTF-8 най-икономичното кодиране за съвместимост с по-стари стандарти, но има недостатъци. За съжаление, за българоговорящите (и като цяло за всички неанглоговорящи) потребители на Windows в Lazarus ще трябва да се сблъскате с някои проблеми при използването на различникодировки: Lazarus използва UTF-8 кодиране, Windows OS използва UTF-16 кодиране, а конзолните приложения на Windows използват системно кодиране CP866 (т.е. стандарт ANSI). Използва се и от някои функции на FPC компилатора. Така че в някои случаи ще трябва да използваме функции за преобразуване на кодиране като UTF8ToConsole(), CP866ToUTF8() и т.н. С тях ще се запознаем по-късно, след време.

И така, нека обобщим някои резултати.

  • Знаке графично представяне на буква, цифра, аритметичен знак, препинателен знак или някакъв друг знак, който съответства на някакъв стандарт за кодиране на знаци.
  • Всеки знак отговаря на своя номер в кодовата таблица на знаците.
  • Има много кодировки (кодова страница).
  • Низе низ от знаци.
  • Цифрите, които въвеждаме на клавиатурата са символи. За да ги третира като числа, програмата извършва автоматично преобразуване от знаци в числа и обратно, когато ни показва резултатите от изчисленията.
  • UTF-8е едно от представянията на Unicode, използвани в Lazarus.
  • Един ред може да съдържа знаци, които заемат 1, 2 или дори повече байта.

Символни типове данни

Поставете бутонTButtonточно в средата на формуляра, щракнете двукратно върху него, за да генерирате манипулатор OnClick. В манипулатора създайте раздел от променливи var, посочете там една променлива от тип Char и програмирайте следния код:

Както можете да видите, тук сме присвоили стойност на променливата ch1 - символът " Z ". Запомнете правилото:

Този пример не е необходимо да се изпълнява, той просто демонстрира използването на кавички в низови изрази и възможността за обединяване на няколко реда в един с помощта на знака "+" в израз.". Но да се върнем към нашия проект. След като присвоихме главната буква "Z" на символната променлива, ние показахме съдържанието на променливата, използвайки низа

Запазете проекта, компилирайте го и стартирайте. Когато програмата с бутона се появи на екрана, натиснете единствения ни бутон - ще се появи съобщение с буквата "Z":

Така можем да работим с отделни знаци. Въпреки това, ако коригирате кода, и вместо буквата "Z" в низа

Ако посочите български символ, тогава при опит за компилиране и стартиране на проекта ще получите грешка " Error: Incompatible types: got "Constant String" expect "Char" " - несъвместимост на типовете String (низ) и Char (знак). Тъй като българските букви заемат по два байта, Lazarus ги третира като символен низ. Това обаче не означава, че изобщо нямаме възможност да работим с отделни знаци на кирилица.

По-рано беше споменато, че Lazarus използва UTF8 формат. За поддържане на този формат са разработени разширени типове данни, включително символни. И така, има тип TUTF8Char, който ви позволява да работите свсекиотделни знаци, включително български. Има смисъл винаги да го използвате вместо стандартния Char. Но за това ще трябва да включим модула LCLType, където е описан този тип.

Ако редът се окаже дълъг, тогава след запетаята можете да прехвърлите текста на друг ред.

Сега нека се върнем към манипулатора за щракване на бутон и да го повторим:

Сега всичко ще работи както трябва и българският знак "I" ще излезе точно като английския "Z".

Това обаче не е всичко. Символите могат да се въвеждат чрез посочване на техния брой в таблицата със символи. За да направите това, предшествайте числото със символа " # ", например:

Число 90 е буквата Z в таблицата със символи, така черезултатът няма да се промени. Можете също да зададете специални символи в низови изрази. Например символ номер 13 е знак за нов ред. Нека променим малко кода отново:

Запазете проекта, компилирайте и стартирайте. Сега съдържанието на двете символни променливи се извежда в едно съобщение, но всяка на свой ред.

Низови типове данни

В Lazarus основният тип низ е String. Поставете още един бутон върху формата на нашия проект. Неговият манипулатор ще изглежда така:

Както можете да видите, тъй като низът в Lazarus е във формат UTF8, тук не са необходими специални трикове за работа с низове, всеки текст, включително български, може да бъде записан в променлива от типа String. Размерът на низ е неограничен, но е възможно да се кодира твърдо размера. Този метод се използва, когато знаете със сигурност, че низът няма да надвиши зададения размер. В този случай размерът се посочва след ключовата дума String в квадратни скоби, например:

Можете да съхранявате до 50 знака в променливата MyStr. Максималният размер на низ, който може да бъде твърдо кодиран по този начин, е 255 знака. Това обаче се отнася за ASCII символи, тоест английски, еднобайтови знаци. Пример:

Този пример за грешка няма да причини, но съобщението няма да бъде напълно, а отрязано: „Кога“. Тоест, първите три букви заеха 6 байта, четвъртата вече не се побираше. В този случай би било правилно да посочите размера не 7, а 14 - с два пъти броя на буквите. На практика обаче типът String обикновено се използва без ограничения, в който случай низът се обработва правилно.

Имайте предвид, че типът String е динамичен, тоест за него не се заделя предварително памет. Строго погледнато, паметта се разпределя на указателлиния, а не самата линия. Физически, необходимата памет се разпределя на линията само в момента на присвояване на някаква стойност към нея. Често обаче става необходимо да се изчисти такава линия. За да направите това, просто го дайте празни кавички, без интервали и без други знаци:

В този случай на низа се присвоява стойност Nil, тоест нула, нищо, и низът става празен.

На низова променлива могат да бъдат присвоени стойностите на символни променливи или константи, например:

Освен String, има и други типове низове вLazarus.