Семинар кодирование информации общие сведения
Скачать 63.47 Kb.
|
4.2. Практическое занятие по перекодировке текстаФОРМУЛИРОВКА ЗАДАНИЯ Разработать программу для перекодировки текстовых файлов, содержащих буквы алфавита кириллицы в кодовых наборах ср1251 и КОИ-8. Имена файлов исходного текста в кодировке КОИ-8 (ср1251) и результата его перекодировки в кодовый набор ср1251 (КОИ-8) должны передаваться программе через аргументы командной строки ее вызова. В программе должен быть предусмотрен анализ возможности доступ к исходному и результирующему файлам в соответствующих режимах обработки с диагностикой ошибочных ситуаций. ПРИНЦИП ПЕРЕКОДИРОВКИ Кодовые наборы ср1251 и КОИ-8 являются расширением кода ASCII для строчных и заглавных букв алфавита кириллицы. Они кодируются натуральными числами из 8 бит в диапазоне от 0300 (192, С0) до 0377 (255, FF). Этот диапазон делится на 2 равные части для строчных и заглавных букв. При этом коды любой строчной и заглавной буквы отличаются на 040 (32, 20), а разность кодов соседних букв равна 1. В кодовом наборе ср1251 заглавные и строчные буквы перечислены в алфавитном порядке, сначала заглавные, потом строчные: АБВГДЕЖЗИЙКЛМНОПРСТУФЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфцчшщъыьэюя В кодовом наборе КОИ-8 порядок перечисления букв отличен от алфавитного. При этом сначала перечислены строчные буквы, потом заглавные: юабцдефгхийклмнопярстужвьызшэщчъюабцдефгхийклмнопярстужвьызшэщъ Формальную схему перекодировки задает комбинаторная подстановка порядковых номеров букв (без учета их регистра) в кодовых наборах ср1251 и КОИ-8, которая номеру каждой буквы в исходной кодировке ставит в соответствие ее номер в результирующей кодировке. В программной реализации эта подстановка задается одномерным массивом sub номеров букв в результирующей кодировке, которые индексированы по порядку их номеров в исходной кодировке. В зависимости от направления перекодировки подстановку номеров букв можно записать следующим образом, используя синтаксис языков программирования C и BASH: КОИ8−>cp1251: cp1251 = sub[КОИ8] cp1251−>КОИ-8: КОИ8=${sub[cp1251]} В любом случае таблицу перекодировки tab образует конкатенация 2-х дубликатов массива sub номеров букв, где значения элементов увеличены на 0340 и 0300 для преобразования номеров букв результирующей кодировки в их коды, которые индексируются порядковыми номерами этих букв в исходной кодировке уже с учетом регистра букв. Учитывая, что номер заглавной или строчной буквы в любой исходной кодировке равен ее коду минус 0300, такой формат таблицы перекодировки tab обеспечивает преобразование кодов букв, независимо от направления перекодировки и регистра букв. Редактирование программы перекодировки ср1251 в КОИ-8 В графическом окне текстового редактора xedit с кириллическим шрифтом ср1251 подготовить исходный текст программы на командном языке BASH для перекодировки файлов из кодового набора ср1251 в кодовый набор КОИ-8. Исходный текст этой программы с обязательными комментариями на русском языке необходимо сохранить в файле rnn.sh (где литеры nn обозначают номер варианта задания). #!/bin/bash # Программа перекодировки текста ср1251 в КОИ-8 function winkoi # Функция построения таблицы перекодировки { # Подстановка номеров букв koi8 (в системе 8) koi8=${num[cp1251]} num=( 01 02 27 07 04 05 26 32 11 12 13 14 15 16 17 20 \ 22 23 24 25 06 10 03 36 33 35 37 31 30 34 00 21 ) # Конкатенация кодов для строчных и заглавных букв в koi8 for i in ${num[*]} ; do # перечисление номеров букв low=$low"\3$i" # склеить lower koi octal code set up=$up"\3`expr $i + 40`" # склеить upper koi octal code set done echo $up$low # total koi octal code set return # возврат из функции winkoi } # function winkoi # Диагностика аргументов командной строки if test $# -lt 2 # Контроль числа аргументов then echo "Usage: `basename $0` input.win output.koi" ; exit −7 fi if ! test -f $1 # Проверка существования входного файла then echo "$1: No such regular file" >&2 ; exit 2 # ENOENT fi if ! test -r $1 # Контроль доступа по чтению для входного файла then echo "$1: Permission denied to read" >&2 ; exit 13 # EACCES fi # Контроль маршрутного имени для выходного файла curdir=`pwd` # маршрутное имя текущего каталога (if basename only) outdir=`expr $2 : '\(.*/\)' \| $curdir` # маршрутное имя каталога if [ ! -w $outdir -a ! -e $2 ] # контроль каталога по (пере)записи then echo "$outdir: Permission denied to write" >&2 ; exit -13 fi if test -d $2 # Проверка, что выходной файл не каталог then echo "$2: Is directory" >&2 ; exit 21 # EISDIR fi if [ -e $2 -a ! -w $2 ] # Контроль перезаписи выходного файла then echo $2: Permission denied to rewrite ; exit 13 # EACCES fi # Транслитерация кодов cp1251 в koi8 cat $1 | tr "\300-\337\340-\377" `winkoi` > $2 exit 0 # Нормальное завершение программы Выполнение и контроль перекодировки ср1251 в КОИ-8 Для интерпретации программы rnn.sh командным процессором BASH нужно ввести, следующую командную строку в графическом окне эмулятора терминала xterm: $ bash rnn.sh rnn.sh rnn.koi Результатом выполнения этой команды будет создание или перезапись файла rnn.koi, который содержит исходный текст программы на языке BASH с комментариями в кодировке КОИ-8. Результат этой перекодировки следует проверить визуально в графическом окне текстового редактора xedit с кириллическим шрифтом КОИ-8. |