Символи та рядки
Знайомство з символьними та рядковими типами даних, використання компонентів для роботи з рядками.
Поняття "символ" та "рядок"
Для пересічного користувача ці поняття дуже абстрактні. Коли він вводить із клавіатури "А", то вважає це символом, літерою. Коли вводить "4", то це – цифра. А про всякі там прогалини, розділові знаки або арифметичні знаки він і зовсім не думає. Але програміст повинен розуміти, як ці знаки сприймаються комп'ютером. Тому наберіться терпіння, ми вивчимо ці поняття досить детально.
Насправді все, що ми вводимо з клавіатури - це символи. Літера "z", цифра "3", пробіл, знак помножити, знак відсотка і т.д. - Все це символи. Комп'ютер же може оперувати тільки цифрами, причому двійковими - такими, які містять лише 0 або 1. Всі ці літери, десяткові цифри та інші знаки для нього не означають зовсім, нічого. І для того, щоб ми могли якось обробляти текст, цифри та іншу інформацію, потрібно було придумати спеціальну систему для переведення інформації на зрозумілу комп'ютеру та назад. Так з'явилисякодові сторінки.
Кодова сторінка(англ. code page) - спеціальна таблиця, яка зіставляє кожному значенню байта певний символ.
Не дуже зрозуміло? Давайте розумітися. Ми знаємо, що інформація вимірюється байтами, і що в одному байті 8 біт. Біт - це мінімальна одиниця інформації, з якою може працювати комп'ютер. У біті може зберігатися або 0 або 1.
На зорі розвитку комп'ютерів було розроблено кодову сторінкуASCII(англ.American Standard Code for Information Interchange- Американський кодовий стандарт обмінюватись інформацією). Перша версія цього стандарту з'явилася в 1963 р. Ця сторінка містила 7 бітні символи, в кожномубайте один біт був не задіяний. Мінімальне двійкове число, яке могло зберігатися в 7 бітах - це нуль. Максимальне – 1111111.
Натисніть кнопку "Пуск", виберіть "Виконати" і у вікні "Запуск програми" вкажіть
та натисніть . Завантажиться стандартний калькулятор Windows. У головному меню програми, у розділі "Вид" виберіть "Інженерний". У лівій частині калькулятора нижче поля введення чисел ви побачите перемикачі різних систем обчислення:

Тут ми маємо можливість перемикатися на чотири системи обчислення:
- Hex- 16-річна. Використовується в основному, в мові Асемблері або при налагодженні програм.
- Dec- 10-ти. Наша звичайна система використовується за замовчуванням.
- Oct- 8-річна. Майже не використовується.
- Bin- 2-річна. Хоч і є для комп'ютера єдино зрозумілою, але внаслідок громіздкості записів, у програмуванні її зазвичай застосовують.
Давайте подивимося, скільки символів могло міститись у кодовій сторінці ASCII . Перейдіть на двійкову систему ( Bin ), введіть 7 одиниць, потім перейдіть назад на десяткову систему (Dec). У нас вийшло 127. Саме стільки символів містилося у першій ASCII таблиці. Крім латинських букв, таблиця містила й інші символи - цифри, арифметичні знаки, розділові знаки, символи пропуску, дужки тощо. Кожному символу відповідав власний номер у таблиці. Якщо ми вводили англійську букву " A " , то комп'ютер потрапляв номер цього символу таблиці - 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 ( Code Page 866), KOI8-R , KOI8-U, ISO-8859-5, і це тільки найпоширеніші! У хаосі стандартів треба було якось розумітися, вдосконалювати їх.
На зміну ASCII прийшло кодуванняANSI(англ.American National Standards Institute- Американський Національний Інститут Стандартів). Так, у MS Windows кодова сторінка ANSI, що містить кирилицю - це Windows -1251 (або CP1251), яка з'явилася в 1990-1991 рр.
Однак і цього було недостатньо, адже для кожної мови, як і раніше, потрібно було власне кодування, а мов на Землі багато. Назріла необхідність переходити до "широких" стандартів, у яких символ займає більше одного байта. Так, в 1991 р. був запропонований стандарт Юнікод (англ. Unicode ) - універсальна система кодування символів, що представляє знаки практично всіх мов. У цьому стандарті в одному документі можна використовувати символи кирилиці, китайські або японські ієрогліфи, символи математичних формул, музичні знаки тощо.
Перша версія Юнікоду мала фіксований розмір символів 2 байти (16 біт). В одному кодуванні вже можна було використовувати 65535 символів! Проте виявилося, що цього недостатньо. Юнікод отримав подальший розвиток, і з року в рік почали з'являтися нові версії та стандарти, засновані на Юнікод. Є такі стандарти, якUTF-8(англ.Unicode Transformation Format, 8 bit - 8-бітний формат перетворення Юнікоду),UTF-16,UTF-32.
Такий підхід робить UTF-8 найекономічнішим кодуванням для сумісності зі старими стандартами, проте є й мінуси. На жаль, для українськомовних (і взагалі для всіх не англомовних) користувачів Windows у Lazarus доведеться зіткнутися з деякими проблемами застосування різнихкодувань: в Lazarus використовується кодування UTF-8, Windows використовує UTF-16, а в консольних додатках Windows використовується системне кодування CP866 (тобто, стандарт ANSI). Її використовують деякі функції компілятора FPC. Так що в деяких випадках нам доведеться користуватися функціями перетворення кодувань, наприклад UTF8ToConsole() , CP866ToUTF8() і т.п. Ми познайомимося з ними пізніше, свого часу.
Отже, підіб'ємо деякі підсумки.
- Символ- це графічне зображення літери, цифри, арифметичного знака, розділового знаку або будь-якого іншого знака, що відповідає будь-якому стандарту кодування символів.
- Кожному символу відповідає його номер кодової таблиці символів.
- Кодування (code page) існує безліч.
- Рядок- це ланцюжок символів.
- Цифри, які ми набираємо на клавіатурі – це символи. Щоб обробляти їх, як цифри, програма виконує автоматичне перетворення із символів на цифри, і назад, коли виводить нам результати обчислень.
- UTF-8- це одне з уявлень Юнікоду, що використовується в Lazarus.
- В одному рядку можуть зустрічатися символи, які займають 1, 2 або навіть більше байт.
Символьні типи даних
Прямо посеред форми встановіть кнопкуTButton, двічі натисніть її, щоб згенерувати обробник OnClick . В обробнику створимо розділ змінних var, вкажемо там одну змінну типу Char, і запрограмуємо наступний код:
Як бачимо, тут ми змінній ch1 надали значення - символ "Z". Запам'ятайте правило:
Цей приклад виконувати не потрібно, він просто демонструє використання лапок у рядкових виразах, і можливість у виразі з'єднувати кілька рядків в один за допомогою знака.Однак повернемося до нашого проекту. Після того, як ми привласнили символьною змінною велику англійську букву "Z", ми вивели вміст змінної за допомогою рядка.
Збережіть проект, скомпілюйте його та виконайте. Коли програма з кнопкою з'явиться на екрані, натисніть на нашу єдину кнопку - вийде повідомлення з літерою "Z":
Таким чином ми можемо працювати з окремими символами. Однак якщо ви виправите код, і замість літери "Z" у рядку
вкажете український символ, то при спробі скомпілювати та запустити проект вийде помилка "Error: Incompatible types: got "Constant String" expected "Char" - несумісність типів String (рядок) і Char (символ). Оскільки українські літери займають по два байти, Lazarus їх вважає рядком символів. Однак це не означає, що ми зовсім не маємо змоги працювати з окремими символами кирилиці.
Раніше згадувалося, що у Lazarus використовується формат UTF8. Для підтримки цього формату було розроблено розширені типи даних, у тому числі і символьні. Так, є тип TUTF8Char, який дозволяє працювати з будь-якими окремими символами, у тому числі й українськими. Має сенс завжди використовувати його замість стандартного Char. Але для цього нам потрібно буде підключити модуль LCLType, де цей тип описаний.
Якщо рядок виходить довгим, то після коми можна переносити текст на інший рядок.
Тепер повернемося до обробника натискання на кнопку та переробимо його:
Тепер все спрацює як слід, і український символ "Я" вийде так само, як англійський "Z".
Однак це ще не все. Символи можна вводити, вказуючи їхній номер у таблиці символів. Для цього перед номером потрібно вказати символ "#", наприклад:
Під номером 90 знаходиться буква Z у таблиці символів, отжерезультат не зміниться. Також у рядкових виразах можна вказувати спеціальні символи. Наприклад, символ під номером 13 – це символ переходу на інший рядок. Давайте знову трохи змінимо код:
Збережіть проект, скомпілюйте та запустіть на виконання. Тепер вміст двох символьних змінних виходить в одному повідомленні, але кожен на своєму рядку.
Рядкові типи даних
У Lazarus основним рядковим типом є String (англ. string – рядок). На форму проекту розмістіть ще одну кнопку. Її обробник буде виглядати так:
Як бачите, оскільки рядок у Lazarus має формат UTF8, то жодних особливих хитрощів для роботи з рядками тут не потрібно, у змінну типу String можна записати будь-який, у тому числі й український текст. Розмір рядка String необмежений, але є можливість жорстко встановити розмір. Такий спосіб використовується, коли ви точно знаєте, що більше цього розміру рядок не буде. У цьому випадку розмір вказується після ключового слова String у квадратних дужках, наприклад:
У змінну MyStr можна записати до 50 символів. Максимальний розмір рядка, який можна жорстко задати у такий спосіб - 255 символів. Однак маються на увазі символи ASCII, тобто англійські, однобайтові. Приклад:
Даний приклад помилки не викликає, проте повідомлення вийде не повністю, а обрізаним: "Прі". Тобто три перші літери зайняли 6 байт, четверта вже не вмістилася. В даному випадку буде правильним вказати розмір не 7, а 14 – за подвоєною кількістю літер. Втім, практично зазвичай застосовують тип String без обмежень, у разі рядок обробляється правильно.
Майте на увазі, що тип String є динамічним, тобто наперед пам'ять для нього не виділяється. Строго кажучи, виділяється пам'ять на покажчикрядки, а чи не на саму рядок. Фізично рядку виділяється необхідна пам'ять лише у момент присвоєння їй якогось значення. Однак нерідко виникає потреба очистити такий рядок. Для цього достатньо привласнити їй порожні лапки, без прогалин і без будь-яких інших символів:
У цьому випадку рядку надається значення Nil , тобто нуль, нічого, і рядок стає порожнім.
Рядковій змінній можна надавати значення символьних змінних або констант, наприклад:
Крім String вLazarusє інші рядкові типи.