Искусственный интеллект. Строки, контекст и волны на Паскале. Сергей Соболенко
Читать онлайн книгу.слово, благодаря перебору символов с «хвоста», уменьшая значение, полученное из длины строки оператором Dec (i). Так же, на всякий случай мы уточняем условие выхода из цикла в случае, если пробел так и не будет достигнут (i <1).
Илл. 8. Копирование последнего слова из фрагмента текста с использованием цикла Repeat и строкового индекса.
Результат удовлетворяет ожиданиям.
Илл. 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 (символ). Операции с символами схожи с операциями со строковым типом, например к переменной строчного