Учебный центр "ANIT Texno Inform"
Опубликован: 25.06.2014 | Доступ: свободный | Студентов: 2595 / 849 | Длительность: 24:39:00
Специальности: Программист
Лекция 5:

Символы и строки

< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
Аннотация: Лекция посвящена работе с символами и строками. Подробно рассмотрен механизм строк в Lazarus, символьные и строковые типы данных. Подробно рассмотрены компоненты для работы со строками.

Цель лекции

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

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

Для рядового пользователя эти понятия весьма абстрактны. Когда он вводит с клавиатуры "А", то считает это символом, буквой. Когда вводит "4", то это - цифра. А про всякие там пробелы, знаки препинания или арифметические знаки он и вовсе не думает. Но программист должен понимать, как все эти знаки воспринимаются компьютером. Поэтому наберитесь терпения, мы изучим эти понятия достаточно подробно.

На самом деле, всё, что мы вводим с клавиатуры - это символы. Буква "z", цифра "3", пробел, знак умножить, знак процента и т.д. - всё это символы. Компьютер же может оперировать только цифрами, причем двоичными - такими, которые содержат лишь 0 или 1. Все эти буквы, десятичные цифры и прочие знаки для него не значат ровным счетом, ничего. И для того, чтобы мы могли как-то обрабатывать текст, цифры и прочую информацию, нужно было придумать специальную систему для перевода информации в понятную компьютеру, и обратно. Так появились кодовые страницы.

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

Не очень понятно? Давайте разбираться. Мы знаем, что информация измеряется байтами, и что в одном байте 8 бит. Бит - это минимальная единица информации, с которой может работать компьютер. В бите может храниться либо 0, либо 1.

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

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

calc
    

и нажмите <Enter>. Загрузится стандартный калькулятор 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, и это только самые распространенные! В хаосе стандартов надо было как-то разбираться, совершенствовать их.

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

Однако и этого было недостаточно, ведь для каждого языка по-прежнему требовалась собственная кодировка, а языков на Земле много. Назрела необходимость переходить к "широким" стандартам, в которых символ занимает более одного байта. Так, в 1991 г. был предложен стандарт Юникод (англ. Unicode) - универсальная система кодирования символов, представляющая знаки практически всех языков. В этом стандарте в одном документе можно использовать символы кириллицы, китайские или японские иероглифы, знаки математических формул, музыкальные знаки и т.п.

Первая версия Юникода имела фиксированный размер символов 2 байта (16 бит). В одной кодировке уже можно было использовать 65 535 символов! Однако оказалось, что и этого недостаточно. Юникод получил дальнейшее развитие, и из года в год стали появляться новые версии и стандарты, основанные на Юникоде. Имеются такие стандарты, как UTF-8 (англ. Unicode Transformation Format, 8 bit - 8-ми битный формат преобразования Юникода), UTF-16, UTF-32.

В Lazarus, в основном, используется формат UTF-8, так что разберем его. UTF-8 появился 2 сентября 1992 года. Основное его отличие от первоначального Unicode в том, что в UTF-8 символы имеют не фиксированный размер! Если используются символы с номером меньшим, чем 128, то они занимают 1 байт, как обычный ASCII-текст. Символы с номером от 128 и больше могут занимать от 2 до 6 байт (реально максимальный размер символа - 4 байта, т.к. в Юникоде нет символов с большим номером). Символы кириллицы занимают, например, по 2 байта. Так что цепочка символов в 5 байт в UTF-8 не всегда означает строку из пяти символов.

Такой подход делает UTF-8 самой экономичной кодировкой для совместимости со старыми стандартами, однако есть и минусы. К сожалению, для русскоязычных (и вообще для всех не англоязычных) пользователей Windows в Lazarus придется столкнуться с некоторыми проблемами применения различных кодировок: в Lazarus используется кодировка UTF-8, ОС Windows использует UTF-16, а в консольных приложениях Windows используется системная кодировка CP866 (то есть, стандарт ANSI). Её же используют некоторые функции компилятора FPC. Так что в некоторых случаях нам придется пользоваться функциями преобразования кодировок, например, UTF8ToConsole(), CP866ToUTF8() и т.п. Мы познакомимся с ними позже, в свое время.

Итак, подведем некоторые итоги.

  • Символ - это графическое изображение буквы, цифры, арифметического знака, знака препинания или какого-либо другого знака, отвечающее какому-либо стандарту кодировки символов.
  • Каждому символу соответствует его номер в кодовой таблице символов.
  • Кодировок (code page) существует множество.
  • Строка - это цепочка символов.
  • Цифры, которые мы набираем на клавиатуре - это символы. Чтобы обрабатывать их, как цифры, программа выполняет автоматическое преобразование из символов в цифры, и обратно, когда выводит нам результаты вычислений.
  • UTF-8 - это одно из представлений Юникода, используемое в Lazarus.
  • В одной строке могут встречаться символы, которые занимают 1, 2 или даже больше байт.
< Лекция 4 || Лекция 5: 12345 || Лекция 6 >
Инга Готфрид
Инга Готфрид
Александр Скрябнев
Александр Скрябнев

Через WMI, или используя утилиту wmic? А может есть еще какие более простые пути...