Илл. 9. Итог работы программы (илл. 8).


Почему же в примерах мы использовали английскую транскрипцию? Очень просто, – поскольку по умолчанию в компиляторе TMT Pascal используется кодировка Win, и та же программа с русским предложением внутри даст непонятный итог:


Илл.10. Пример неудачного использования программы по работе с текстом, – из-за несовпадения кодировок ввода (Win) и вывода (DOS) удовлетворительный результат не может быть получен.


Так он будет выглядеть, несмотря на то, что формальных ошибок мы не допускали:


Илл. 11. Так выглядит фиаско при несовпадении кодировок.


И это ничто иное как слово «раму», не переведенное в Dos-кодировку.

Похожий, «никакой» результат мы получим, если, например, напишем символы «а» в строке в английской раскладке, а предложение – на русском; тогда функция Pos из поиска вернет значение отсутствия символа (0), хотя визуально нам кажется, что никакого различия в написании нет.

Эти проблемы открывают целый пласт операционных задач, связанных с кодировками.

Кодировки

Ввод данных в стандартном окне программы DOS осуществляется в кодировке DOS ASCII. Также и данные, которые в нем отображаются, имеют кодировку DOS.

В случае, если нам требуется обрабатывать данные из какого-либо внешнего источника, например из приложения «Блокнот», скорее всего, потребуется перекодирование из Win-кодировки. «Скорее всего» поскольку символы цифр, пробелов, пунктуации и английских букв имеют одинаковые адресные значения как в кодировке Win, так и в DOS; но символы дополнительных языков, например кириллицы, имеют различные значения в различных кодировках. Между тем если и вывод и ввод осуществляется в фоновом режиме, и как исходные данные так и обрабатываемые находятся в одной кодировке, перекодирование из одной кодировки в другую также может и не потребоваться. (Например, в случае, когда мы принимаем в обработку данные, записанные в кодировке Win, и записываем их часть в другой файл, имеющий ту же кодировку Win).

Для разбора кодировки символов нам понадобится следующая пара функций:

CHR (x) – указывает на символ с числом X из символьной таблицы (это можно сделать и служебным обозначением «#x», например K:=#32, — в данном случае, значение k будет равно пробелу, символу с кодом «32» в соответствии с таблицей символов ASCII).

ORD (k) – возвращает код символа K из символьной таблицы.

Здесь, K имеет тип Char (символ). Операции с символами схожи с операциями со строковым типом, например к переменной строчного типа мы можем добавить символ:

S:=S+K;

Здесь, если содержимое S=«Мама мыла раму», а K=«c», мы получим значение S=«Мама мыла рамуc»;


Значения таблицы символов по величине равны одному байту, следовательно, они могут принимать численные значения в диапазоне от 0 до 255.

Чтобы вывести стандартную таблицу символов, нам понадобится следующая программа:


Илл. 12. Программа для вывода таблицы символов ASCII DOS.


Мы несколько усложнили ее для того, чтобы получить ровную таблицу: здесь мы выделили код символа другим цветом, и добавили символы: «0» к двузначным и «00» однозначным числам.

Так мы выводим значения таблицы символов ASCII в DOS-кодировке, кроме управляющих символов с кодами «11» («vertical tab»/ «вертикальная табуляция»), «12» («form feed»/ «смена страницы») и «13» («Enter»). Также был «испорчен» управляющий символ «8», равнозначный команде удаления предыдущего символа с клавишей «Backspace».26


Илл. 13. Результат вывода таблицы символов в программе Tabsym.


Здесь, символы с кодами до 32 являются служебными.

Кстати, из управляющих символов в будущем нам могут понадобиться: