Ноу Інти, лекція, символи і рядки

мета лекції

Знайомство з символьними і рядковими типами даних, використання компонентів для роботи з рядками.

Поняття "символ" і "рядок"

Для рядового користувача ці поняття досить абстрактні. Коли він вводить з клавіатури "А", то вважає це символом, буквою. Коли вводить "4", то це - цифра. А про всякі там прогалини, знаки пунктуації або арифметичні знаки він і зовсім не думає. Але програміст повинен розуміти, як всі ці знаки сприймаються комп'ютером. Тому наберіться терпіння, ми вивчимо ці поняття досить докладно.

Насправді, все, що ми вводимо з клавіатури - це символи. Буква "z", цифра "3", пробіл. знак помножити, знак відсотка і т.д. - все це символи. Комп'ютер же може оперувати тільки цифрами, причому двійковими - такими, які містять лише 0 або 1. Всі ці літери, десяткові цифри та інші знаки для нього не значать зовсім, нічого. І для того, щоб ми могли якось обробляти текст, цифри та іншу інформацію, потрібно було придумати спеціальну систему для перекладу інформації в зрозумілу комп'ютеру, і назад. Так з'явилися кодові сторінки.

Кодова сторінка (англ. Code page) - спеціальна таблиця, що зіставляє кожному значенню байта деякий символ.

Не дуже зрозуміло? Давайте розбиратися. Ми знаємо, що інформація вимірюється байтами, і що в одному байті 8 біт. Біт - це мінімальна одиниця інформації, з якою може працювати комп'ютер. У бите може зберігатися або 0, або 1.

На зорі розвитку комп'ютерів була розроблена кодова сторінка ASCII (англ. American Standard Code for Information Interchange - Американський кодовий стандарт для обміну інформацією). Перша версія цього стандарту з'явилася в 1963 р Ця сторінка містила 7-ми бітові символи, в кожному байті один біт був не задіяне. Мінімальна двійковечисло, яке могло зберігатися в 7-ми бітах - це нуль. Максимальна - 1111111.

Натисніть кнопку "Пуск", виберіть команду "Виконати" і у вікні "Запуск програми" вкажіть

та натисніть . Завантажиться стандартний калькулятор Windows. У головному меню програми, в розділі "Вид" виберіть "Інженерний". У лівій частині калькулятора, нижче поля введення чисел, ви побачите перемикачі різних систем обчислення:

Ноу Інти, лекція, символи і рядки


Мал. 5.1. перемикачі калькулятора

Тут ми маємо можливість перемикатися на чотири системи обчислення:

  • 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, і це тільки найпоширеніші! У хаосі стандартів треба було якось розбиратися, удосконалювати їх.

Перша версія Юнікоду мала фіксований розмір символів 2 байта (16 біт). В одному кодуванні вже можна було використовувати 65 535 символів! Однак виявилося, що і цього недостатньо. Юнікод отримав подальший розвиток, і з року в рік стали з'являтися нові версії і стандарти, засновані на Юникоде. Є такі стандарти, як 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 або навіть більше байт.

Дякуємо за Ваш чудовий курс!

У самостійній роботі №2 при компіляції модуля MyCript.pas (ОС: Windows 7 x64, Lazarus 1.4 win64) видається помилка на код асемблера

mycript.pas (54,5) Error: Asm: [push reg32] invalid combination of opcode and operands
mycript.pas (95,5) Error: Asm: [pop reg32] invalid combination of opcode and operands

Я розумію, що курс готувався для 32 розрядних ОС, але як бути в разі 64 розрядних систем?

У обробниках пунктів меню FileCreate і FileOpen, а також в обробнику закриття форми OnClose - в цих трьох процедурах міститься один і той же код

їх перед створенням нового тексту>
if Memo1.Modified then begin
// якщо користувач згоден зберегти зміни:
if MessageDlg ( 'Збереження файлу',
'Поточний файл був змінений. Зберегти зміни?',
mtConfirmation, [mbYes, mbNo, mbIgnore], 0) = mrYes then
FileSaveClick (Sender);
end; // if

Дозвольте запитати: чи не краще було б винести цей код в окрему процедуру, наприклад - в обробник події форми OnCloseQuery? Наскільки я пам'ятаю з досвіду Delphi, виклик цієї процедури сам по собі не повинен призводити до закриття форми. А значить, її можна використовувати і в процедурах очищення Memo1 і читання з файлу. Або в Lazarus так робити не можна?