|
||||||||||||||||||||||||||||||||||||||||||||||||||
Практикум по теме «Кодирование текста»Продолжение. См. № 7/2009 Выполняя лабораторную работу (см. №
7/2009), учащиеся получили кодовую таблицу для Windows
— Учебные материалы и задания для учащихсяТаблицы кодировки Наверное, вам приходилось сталкиваться с ситуацией, когда текст на экране компьютера выглядит, как нарочно зашифрованный. Например, так: Происходят такие неприятности в результате существования не одной-единственной, а нескольких таблиц кодировки. Почему так получилось? Американский стандартный код для обмена информацией (ASCII) первоначально был разработан для передачи текстов по телеграфу, причем в то время он был 7-битовым, то есть для кодирования символов английского языка, служебных и управляющих символов использовались только 128 семибитовых комбинаций. При этом первые 32 кода служили для кодирования управляющих сигналов (начало текста, конец строки, перевод каретки, звонок, конец текста и т.д.). При разработке первых компьютеров фирмы IBM этот код был использован для представления символов в компьютере. На кодирование каждого символа был отведен байт, а поскольку в исходном коде ASCII было всего 128 символов, для их кодирования хватило половины восьмибайтовых кодов. Оставшуюся вторую половину кодов стали использовать для представления символов псевдографики, математических знаков и некоторых символов из языков, отличных от английского (греческих букв, немецких умляутов, французских диакритических знаков и т.п.). Когда стали приспосабливать компьютеры для других стран и языков, фирма IBM ввела в употребление несколько кодовых таблиц, ориентированных на конкретные страны. Так, для скандинавских стран была предложена таблица CP-865 (Nordic), для арабских стран — таблица CP-864 (Arabic), для Израиля — таблица CP-862 (Israel) и так далее. В этих таблицах часть кодов из второй половины кодовой таблицы использовалась для представления символов национальных алфавитов. С русским языком ситуация развивалась особым образом. Появилось несколько разных таблиц с символами кириллицы: KOI8-R, CP-866, CP-1251 (именно ее вы получили в лабораторной работе), ISO-8551-5... Одна из причин в том, что таблица кодировки связана с операционной системой (операционная система управляет компьютером и осуществляет операции ввода-вывода информации). Программы для работы с текстами — текстовые редакторы, браузеры — “умеют” перекодировать текст в соответствии с указанной таблицей кодировки.
Но даже наличие множества различных национальных таблиц кодировки не может решить всех проблем с кодированием текстов. Для таких языков, как китайский или японский, вообще 256 символов недостаточно. Кроме того, всегда существует проблема вывода или сохранения в одном файле одновременно текстов на разных языках (например, при цитировании). Поэтому была разработана универсальная кодовая таблица UNICODE, содержащая символы, применяемые в языках всех народов мира, а также различные служебные и вспомогательные символы (знаки препинания, математические и технические символы, стрелки, диакритические знаки и т.д.). Очевидно, что одного байта недостаточно для кодирования такого большого количества символов в одной таблице. Поэтому в UNICODE используются 16-битовые (двухбайтовые) коды. К настоящему времени задействовано около 49 000 кодов, время от времени в таблицу добавляются новые знаки. Например, в сентябре 1998 г. в таблицу был внесен символ валюты EURO. Сейчас в компьютерном мире сосуществуют однобайтовые и двухбайтовые таблицы кодировки, но постепенно будет полностью осуществлен переход на UNICODE. Задание 1. Подберите с помощью браузера кодировку для следующих страниц. Примечание для читателя “Информатики”: учитель создает для этого задания две-три web-страницы с текстом в разных кодировках и тэг <meta> с указанием кодовой страницы удаляет. Запишите, какие таблицы кодировки использованы в этих документах. 2. Вы обратили внимание на то, что при любых изменениях кодировки английские слова прекрасно читаются? Объясните, почему так получается. 3. Рассчитайте, сколько всего различных текстовых символов можно закодировать двоичным кодом при двухбайтовой системе кодирования. Получение разных кодовых таблиц Выполняя лабораторную работу, вы получили шестнадцатеричную кодовую таблицу CP-1251. Ведь именно с этой таблицей работает русифицированная операционная среда Windows. Для получения таблицы вы написали программу на Лого. А таблицу поместили и оформили в документе MS Word. Если эту таблицу поместить на web-страницу (то есть в документ HTML), то можно с помощью браузера получить и другие таблицы кодировки. 1. Получение web-страницы с таблицей кодировки Помните, какие тэги нужны для создания таблицы на web-странице? Вот пример HTML-кода для таблицы, состоящей из четырех ячеек (двух столбцов и двух строк): <TABLE> <TR> (начало первой строки) <TD> содержимое ячейки 1 </TD> <TD> содержимое ячейки 2 </TD> </TR>(конец первой строки) <TR> (начало второй строки) <TD> содержимое ячейки 3 </TD> <TD> содержимое ячейки 4 </TD> </TR>(конец второй строки) </TABLE> Откройте вашу программу получения
таблицы кодировки. Внесите в программу
изменения: в текстовое окно должны попасть
теперь еще и тэги для строк и ячеек. Не забудьте
добавить тэги структуры HTML-документа.
В результате в текстовом окне должен
появиться HTML-код web-страницы, содержащей кодовую
таблицу. Просмотрите получившуюся страницу в браузере. Если с таблицей все в порядке, можно начинать эксперименты. Попробуйте менять кодировку страницы — вид таблицы должен меняться. Таким образом можно получить все кодовые таблицы, имеющиеся в браузере (только однобайтовые, конечно!). Сформулируйте, что именно меняется в таблице при переходе от одной кодировки к другой. 2. Добавление десятичного номера Для вашей следующей работы (создания программы-перекодировщика) нужно, чтобы в таблице были еще и десятичные номера символов. Например, так, как на этой картинке: Усовершенствуйте вашу программу так, чтобы на web-странице появились и номера. Сделайте скриншоты кодовых таблиц с кириллицей: Windows-1251, KOI8-R, CP-866, MacCyrillic. Сохраните скриншоты в отдельных файлах в формате GIF. Время на выполнение этой части практикума — 3 урока. Пример решения Исходная программа: это таблица make "n 32 repeat 14 [строчка :n pr [] make "n :n + 16] end это строчка :n repeat 16 [insert char :n insert char 32 make "n :n + 1] end Результат — 14 строк по 16 символов в каждой. Программа, создающая HTML-код (без десятичных номеров): это таблица_html make "n 32 insert [<html> <body> <table>] repeat 14 [insert [<tr>] строчка_html :n insert [</tr>] pr[] make "n :n + 16] insert [</table> </body> </html>] end это строчка_html :n repeat 16 [insert [<td>] insert char :n insert char 32 insert [</td>] make "n :n + 1] end Результат — код web-страницы с кодовой таблицей. В коде не содержится тэг с указанием кодировки, поэтому на этой странице можно увидеть любую однобайтовую таблицу кодировки. Программа, выводящая HTML-код для страницы, на которой кодовая таблица с подписанными под каждым символом десятичными номерами: это таблица_html_1 make "n 32 insert [<html> <body> <table>] repeat 14 [insert [<tr>] строчка_html :n insert [</tr>] pr[] insert [<tr>] номер :n pr [] make "n :n + 16]] insert [</table> </body> </html>] end
это строчка_html :n repeat 16 [insert [<td>] insert char :n insert char 32 insert [</td>] make "n :n + 1] end это номер :n repeat 16 [insert [<td>] insert :n insert char 32 insert [</td>] make "n :n + 1] end В таблице оказывается вдвое больше строк (28). Дополнительная вспомогательная процедура номер создает под каждым символом его десятичный код. Выполняя предыдущее задание, учащиеся самостоятельно получили несколько кодовых таблиц с символами кириллицы. Конечная цель практикума — создание программы перекодирования текста, содержащего русские буквы, из кодировки Windows-1251 в кодировку DOS-866 и обратно. Сначала нужно познакомиться со средствами языка программирования для работы с текстом и более подробно разобрать некоторые особенности языка Лого, а также решить несколько подготовительных задач. Версия среды — ЛогоМиры 2.0. Время — 6 уроков.
Учебные материалы и задания для учащихсяКак зашифровать текст Редактируя какой-либо текст, вы перемещаете курсор, выделяете фрагменты, затем копируете или вырезаете их. При этом копия фрагмента попадает в буфер обмена и потом может быть использована для вставки. Все эти действия можно запрограммировать, и для этого в среде ЛогоМиры имеется целый набор команд и операций. Например, инструкция REPEAT 10 [CF] переместит курсор на десять “шагов” вправо. А выполнение инструкции SELECT REPEAT 10 [CF] приведет к тому, что следующие десять знаков текста будут выделены. Если выполнить после этого команду CUT, то выделенный фрагмент текста будет вырезан. Все новые команды не имеют параметров. Откройте новый файл ЛогоМиров и создайте на листе текстовое окно. Сохраните файл в вашем рабочем каталоге. Для дальнейшей работы вам понадобится небольшой пробный текст — 3–4 абзаца. Наберите текст произвольного содержания и сохраните его с помощью команды SAVETEXT "имя_файла . Текстовый файл будет записан в ваш рабочий каталог. Проверьте действие приведенных выше инструкций, содержащих команды для работы с текстом. Кроме команд, вам понадобятся новые операции. В языке Лого команда позволяет выполнить какие-то действия. Операция (иногда используется слово датчик) помогает что-либо измерить или вычислить. Например, операция COLOR нужна для определения цвета черепашки, а операция COLORUNDER — для определения цвета поля, на котором черепашка находится. Результат, возвращаемый операцией, должен быть передан команде (или другой операции, которая передаст его команде). Разберем, например, инструкцию PRINT RANDOM 100. PRINT — это команда, RANDOM — операция. Инструкция выполняется справа налево, как бы с конца. Вначале компьютер выберет случайное целое число в диапазоне от 0 до 100. Затем результат выполнения операции RANDOM будет передан команде вывода PRINT . В результате на экране появится случайное число. Еще один пример. QUESTION [Ваше имя?] MAKE "N ANSWER INSERT :N INSERT [! Мне приятно с Вами познакомиться!] Команда QUESTION выводит текст вопроса в специальное диалоговое окно, которое закроется после того, как вы ответите на этот вопрос. Затем команда присваивания MAKE помещает в переменную N на хранение ваш ответ, возвращаемый операцией ANSWER. Значение переменной N затем используется в диалоге. Операции, так же как и команды, могут быть с параметрами и без них. Выполняя лабораторную работу “Кодирование текста”, вы использовали операции для работы с символами CHAR и ASCII . Кроме них, вам понадобятся еще две новые операции: Эти операции не имеют параметров. Результат операции EOT? — логическая величина, то есть ИСТИНА или ЛОЖЬ. Логические величины используются в качестве условий в командах ветвления. Как можно использовать новые операции? Предположим, нужно пересчитать все запятые в тексте. Это можно сделать с помощью рекурсивной процедуры. Сначала текст надо вывести на экран. Для этого можно воспользоваться командой LOADTEXT "имя (укажите имя файла, в котором вы сохранили пробный текст). Выведем текст, установим курсор в начало текста и присвоим переменной K (счетчику запятых) значение, равное нулю. А затем запустим рекурсивную процедуру: это подсчет IF EOT? [STOP] SELECT CF COPY IF CLIPBOARD = ", [MAKE "K :K + 1] подсчет END В первой строке процедуры — условие остановки. Если дошли до конца текста, то работа закончена. Во второй строке — помещение следующего знака в буфер обмена. В третьей строке — анализ содержимого буфера обмена (в нем содержится единственный символ). Если этот символ — запятая, то к счетчику прибавляется единица. Обратите внимание: перед запятой стоит специальный знак языка Лого — двойная кавычка (без пробела). Так отмечаются отдельные символы и последовательности символов — слова. Именно поэтому двойной кавычкой предваряется имя переменной в команде присваивания. (А двоеточием — другим специальным знаком языка Лого — предваряется значение переменной.) В четвертой, последней строке — рекурсивный вызов нашей процедуры. Все действия будут повторяться снова и снова, пока курсор не доберется до конца текста. Проверьте все приведенные примеры использования операций в вашем файле ЛогоМиров. А затем решите несколько задач. Задачи 1. Напишите процедуру, вставляющую пробелы после каждого символа в тексте. Напишите вторую процедуру для приведения текста в первоначальное состояние (она должна удалить только те пробелы, которые были вставлены первой процедурой). Для вызова этих и последующих процедур создавайте на листе кнопки. 2. Напишите процедуру, удаляющую все пробелы в тексте. 3. Если вы читали “Золотого теленка”, то, наверное, помните, как Остап Бендер купил на толкучке печатную машинку с “турэцким акцэнтом” (у нее отсутствовала клавиша с буквой “е”). Напишите процедуру, заменяющую во всем тексте буквы “е” на “э”. 4. Действуя подобным образом, можно зашифровать текст. Подготовьте для этого инструмент: процедуру ЗАМЕНА с двумя параметрами — какую букву искать и на какую ее заменять. Зашифруйте ваш текст: замените все “а” на “ы”, “с” — на “з”, “т” — на “д”. А затем попробуйте расшифровать, используя ту же процедуру. Придумайте способ, позволяющий зашифровывать и расшифровывать текст с помощью процедуры ЗАМЕНА. Напишите две процедуры для шифрования и дешифрования текста методом подстановки. 5. Напишите процедуру для другого способа шифрования текста: каждый символ текста с кодом больше ста должен быть заменен на предыдущий в таблице символов (то есть на символ, имеющий код на единицу меньше). Напишите процедуру для дешифрования измененного таким образом текста. Создание программы для перекодировки текстов Получив несколько кодовых таблиц, вы установили, что в таблицах кодировок CP-1251 и CP-866 русские буквы стоят на разных местах. Это и приводит порой к тому, что текст не удается прочитать. Если русские буквы были закодированы по одной таблице, а программа пытается раскодировать текст по другой таблице, то на экране можно увидеть “абракадабру”. Как расшифровать такой текст? Пусть мы открыли текстовый файл редактором Блокнот и увидели следующее: Редактор Блокнот — это программа, работающая под управлением операционной системы Windows. Значит, она использует кодовую таблицу CP-1251. Определим десятичный код каждого знака по этой таблице, а затем посмотрим в другую кодовую таблицу — предположим, в CP-866. И выясним, какие знаки соответствуют этим кодам (см. схему выше). Слово расшифровано. (Коды указаны в десятичной системе.) Конечно, никто не делает такую расшифровку вручную, эту работу можно запрограммировать. А для этого полезно выяснить, какая зависимость существует между кодами русских букв в таблицах CP-1251 и CP-866. Рассмотрим это на примере слова СИМВОЛ .
Оказывается, для первой буквы разность кодов равна 16, а для остальных — 64. То есть программа должна заменять такие символы, увеличив код на 64 (так, как в задаче 5 из предыдущего параграфа). Для наглядности удобно изобразить расположение символов в кодовой таблице CP-1251 на отрезке длиной 256 условных единиц (см. рисунок ниже). Задание 1. Откройте новый документ MS Word. Создайте с помощью векторного графического редактора, встроенного в MS Word, две схемы расположения символов в кодовых таблицах CP-1251 и CP-866. Полезный совет: установите для страницы альбомную ориентацию. Выясните с помощью ваших схем величину сдвига в кодах для русских букв. Создайте таблицу и внесите в нее полученные данные. После того как вы построили и сравнили две диаграммы, у вас есть все необходимые данные для того, чтобы написать программу перекодировки. В программе будет необходимо анализировать код символа — находится ли код в некотором интервале значений. В таких случаях в команде условного ветвления нужно сформулировать составное условие. Для этого в языках программирования используют специальные логические операции AND , OR, NOT (И, ИЛИ, НЕ). Например, программе надо выполнить некоторые действия, если значение переменной 100 < K < 200. То есть должны быть выполнены два простых условия: K > 100 И K < 200 . По правилам языка Лого это записывается так: IF AND :K > 100 :K < 200 [...] Если же необходимо, наоборот, выделить такую ситуацию, когда значение K не попадает в этот интервал, то команду условного ветвления можно записать так: IF OR :K < 100 :K > 200 [...] То есть K < 100 ИЛИ K >200 *. В обоих примерах с помощью логической операции из двух простых условий сформировано составное условие. В соответствии с правилами языка Лого логические операции OR и AND записаны перед своими операндами (простыми условиями). Задание 1. Напишите программу для
перекодировки текста Для проверки правильности работы программы используйте файловый менеджер Far. В режиме просмотра можно менять кодировку клавишей F8. Используйте панель инструментов среды ЛогоМиры для того, чтобы сделать работу с программой удобной. Например, реализуйте управление с помощью кнопок; поместите на листе инструкцию-“подсказку” по работе с программой. Предусмотрите возможность сохранить перекодированный текст в файле. Для этого вам понадобятся команда QUESTION , операция ANSWER , команда SAVETEXT . Примеры выполнения заданийЗадачи Предварительно на листе проекта ЛогоМиров должно быть создано текстовое окно, файл должен быть сохранен и в этой же папке записан текстовый файл пробный.txt. это подготовка ct loadtext "пробный top end
это пробелы подготовка удаление end
это удаление if eot? [stop] select cf copy if clipboard = char 32 [cb delete] удаление end
это турецкий_акцент подготовка акцент end
это акцент if eot? [stop] select cf copy if clipboard = "е [cb delete insert "э] акцент end
это подстановка :a :b if eot? [stop] select cf copy if clipboard = :a [cb delete insert :b] if clipboard = :b [cb delete insert :a] подстановка :a :b end
это демо_1 подготовка подстановка "а "е wait 30 top подстановка "а "е end Процедура демо_1 демонстрирует шифрование текста методом подстановки. Через три секунды текст расшифровывается. это шифровка if eot? [stop] select cf copy make "n ascii clipboard if :n > 100 [cb delete insert char :n — 1] шифровка end
это расшифровка if eot? [stop] select cf copy make "n ascii clipboard if :n > 99 [cb delete insert char :n + 1] расшифровка end это демо_2 подготовка шифровка wait 30 top расшифровка end Процедура демо_2 демонстрирует шифрование текста способом, указанным в последней задаче. Через три секунды текст расшифровывается. Линейные диаграммы Вывод: если в тексте, закодированном по CP-1251, попадаются буквы с кодом от 192 до 239, то от кода необходимо отнять 64. Тогда мы перейдем в CP-866 (это русские буквы от А до п). Для букв с кодами от 240 до 255 (р – я) для перехода из CP-1251 в CP-866 разность в коде — 16. Программы перекодировки это Win-DOS if eot? [stop] select cf copy make "n ascii clipboard if and :n > 191 :n < 240 [cb delete insert char :n — 64] if and :n > 239 :n < 256 [cb delete insert char :n — 16] Win-DOS end
это DOS-Win if eot? [stop] select cf copy make "n ascii clipboard if and :n > 127 :n < 176 [cb delete insert char :n + 64] if and :n > 223 :n < 240 [cb delete insert char :n + 16] DOS-Win end
это демо_3 подготовка Win-DOS wait 30 top DOS-Win end Процедура демо_3 демонстрирует перевод текста из кодировки CP-1251 в кодировку CP-866. Затем, через три секунды, производится обратный перевод. Методические комментарии к практикуму Предложенный читателям “Информатики” практикум — часть базового курса для 7–9-х классов. Этот вариант курса информатики построен на нескольких принципах. Во-первых, различные “линии” курса — программирование, технология обработки графики, текста, теория (например, системы счисления) и т.д. — не разнесены по годам обучения или, скажем, по полугодиям. А, наоборот, перемежаются и переплетаются. Во-вторых, новый учебный материал появляется перед учащимися в тот момент, когда возникает практическая необходимость. То есть в контексте некоторого задания или мини-проекта. Например, разговор о логических операторах заходит первый раз, когда нужно написать программу перекодировки. И без нового средства никак не обойтись. Это не означает, конечно, что потом не будет обобщения и рассказа и об Аристотеле, и о Дж. Буле. Другими словами, общий подход в обучении информатике в данном курсе — не от общего к частному, а наоборот. Поэтому в основе лежит цепочка задач, заданий, мини-проектов и практикумов. Задания практикума “Кодирование текста” имеют комплексный характер. Учащиеся и программируют, и переводят числа из одной системы счисления в другую, работают с векторным графическим редактором, подготавливают иллюстрации для текстового документа (отчета), форматируют таблицы, используют язык HTML, работают с браузером и файловым менеджером. Переходы от одного вида деятельности к другому не мешают осваивать достаточно сложный раздел курса. Наоборот, такое разнообразие помогает поддерживать интерес к работе над заданиями и к нашему предмету.
* Более строго следовало записать K ≤ 100 ИЛИ K ≥ 200. Ал. Ге. Юдина | ||||||||||||||||||||||||||||||||||||||||||||||||||