Главная страница «Первого сентября»Главная страница журнала «Информатика»Содержание №8/2009


Материалы к уроку

Практикум по теме «Кодирование текста»

Продолжение. См. № 7/2009

Выполняя лабораторную работу (см. № 7/2009), учащиеся получили кодовую таблицу для Windows —
CP-1251. Следующие этапы практикума — познакомиться с существованием множества кодовых таблиц, самостоятельно получить другие кодовые таблицы с символами кириллицы и, наконец, написать программу перекодировки текста (все программирование в этом варианте курса информатики — на Лого).

Учебные материалы и задания для учащихся

Таблицы кодировки

Наверное, вам приходилось сталкиваться с ситуацией, когда текст на экране компьютера выглядит, как нарочно зашифрованный. Например, так:

Происходят такие неприятности в результате существования не одной-единственной, а нескольких таблиц кодировки. Почему так получилось?

Американский стандартный код для обмена информацией (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...

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

Программы для работы с текстами — текстовые редакторы, браузеры — “умеют” перекодировать текст в соответствии с указанной таблицей кодировки.

Кодировка на web-странице

Грамотно сделанный HTML-документ обязательно должен содержать специальный тег с указанием использованной в нем таблицы кодировки. Если вы попали в Интернете на “нечитаемую” страницу, то скорее всего в HTML-коде нет тега с кодировкой. Но браузер поможет вам прочесть страницу. Для этого в браузерах есть специальное меню.

Например, в браузере Internet Explorer зайдите в пункт меню View/Encoding (Вид/Кодировка). Вы увидите меню, в котором можно выбрать таблицу кодировки. Попробуйте изменить кодировку этой страницы.

Но даже наличие множества различных национальных таблиц кодировки не может решить всех проблем с кодированием текстов. Для таких языков, как китайский или японский, вообще 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 уроков.

Команды перемещения курсора по тексту

Команды для редактирования текста

CF (cursor forward)

на одну позицию вправо

SELECT

включить режим выделения

CB (cursor back)

на одну позицию влево

UNSELECT

снять выделение

CU (cursor up)

на одну строку вверх

COPY

CD (cursor down)

на одну строку вниз

CUT

TOP

в начало текста

PASTE

BOTTOM

в конец текста

DELETE

Учебные материалы и задания для учащихся

Как зашифровать текст

Редактируя какой-либо текст, вы перемещаете курсор, выделяете фрагменты, затем копируете или вырезаете их. При этом копия фрагмента попадает в буфер обмена и потом может быть использована для вставки. Все эти действия можно запрограммировать, и для этого в среде ЛогоМиры имеется целый набор команд и операций.

Например, инструкция 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. Рассмотрим это на примере слова СИМВОЛ .

225

168

172

162

174

171

код по табл. CP-866

с

и

м

в

о

л

241

232

236

226

238

235

код по табл. CP-1251

Оказывается, для первой буквы разность кодов равна 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. Напишите программу для перекодировки текста
CP-1251–CP-866 и программу для обратной перекодировки. Проверьте программы на вашем пробном тексте.

Для проверки правильности работы программы используйте файловый менеджер 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.

Ал. Ге. Юдина

TopList