Проблемы для кодирования национальных алфавитов. Веб-дизайн и поисковая оптимизация

Создание формы обратной связи

О проблемах с кодировкой файлов

При создании формы обратной связи частенько возникают проблемы с кодировкой файлов, из-за чего приходящее на E-mail письмо состоит из замечательных квадратиков, ромбиков и других "кракозяблов".

Рассмотрим это вопиющее недоразумение подробнее. Как известно, кодировка (charset) - это метод представления символов для их передачи. В конце концов, любая информация, циркулирующая в компьютере - это последовательность нулей и единиц. Кодировка символов состоит из нескольких байтов, обычно от 1 до 4. Кодировок существует множество, и браузер должен правильно определить, в какой из них написана открываемая страничка сайта.

В большинстве случаев современные браузеры успешно справляются с этой задачей самостоятельно. Однако для правильного определения кодировки принято в HTML-коде давать подсказку с помощью мета-тега, например,
или
.
.

Начинающие веб-дизайнеры иногда ошибочно считают, что достаточно вставить нужный мета-тег в начало страницы - и всё будет ОК! Это заблуждение. Как справедливо писал Козьма Прутков: "Если на клетке со слоном увидишь надпись "Буйвол" – не верь глазам своим." Необходимо не только написать, к примеру, charset=utf-8, но и проследить, что страница реально сделана в указанной кодировке .

Истинную кодировку страницы проще всего узнать, открыв её в любом браузере и выбрав в меню пункт Вид - Кодировка . Изменяя кодировки, определите, при какой из них страница отображается правильно - это и будет ваша реальная кодировка. Её и указывайте в мета-теге. Если вы хотите изменить кодировку, то для этого необходимо зайти в установки программы, с помощью которой вы создаете сайт, и задать требуемую кодировку. Например, в программе Adobe Dreamweaver для этого надо выбрать раздел меню Редактировать - Установки...- Создать документ - Кодировка по умолчанию . Обычно используют кодировки charset=utf-8 или charset=windows-1251 .

Замечание : мета-тег указания кодировки желательно размещать в самом начале HTML-кода сразу за тегом , чтобы браузер выбрал правильную кодировку уже перед выводом названия страницы (тег ...), которое показывается на синей полосе вверху окна браузера. В противном случае, вместо мы можем увидеть всё те же замечательные квадратики и ромбики.</p> </blockquote> <p>Абсолютно не нужные нам проблемы с кодировкой возникают и тогда, когда страничка сайта состоит из нескольких файлов, например, вставки фреймов, скриптов <b>JavaScript </b> и т.п. Необходимо следить, чтобы все эти части были созданы в одной кодировке. Кстати, именно для этого случая в почтовых программах, например, на mail.ru , обычно есть несколько кнопок ручного переключения кодировок, так как автоматически определить, в какой кодировке написано приходящее на почту письмо, иногда бывает затруднительно.</p> <p>Возвращаясь к нашей форме обратной связи , следует учесть, что данные о кодировке сообщения могут измениться при пересылке. Упрощенно, механизм доставки письма с формы на ваш E-mail выглядит следующим образом. Сначала письмо попадает на промежуточный почтовый ящик на сервере вашего хостинга, а уже с него посылается на указанный вами в РНР-файле адрес. Этот промежуточный ящик вы легко найдете, заглянув в панели управления вашего сайта в раздел <b>Почта </b>. Весь этот процесс происходит под управлением РНР-программы. Следовательно, в ней тоже полезно лишний раз указать правильную кодировку вашего файла.</p> <p>Для этого необходимо в РНР-файле (в нашей форме <a href="/knopka-obratnoi-svyazi-wordpress-kak-sozdat-kontaktnuyu-formu/">обратной связи</a> это <b>mail.php </b>) добавить строку заголовков (<b>headers </b>), которая служит для определения в <a href="/portativnaya-pochtovaya-programma-pochtovyi-klient-osobennosti-vybora-pochtovoi-programmy/">почтовой программе</a> некоторых дополнительных параметров письма: тип документа <b>text/plain </b> (простой текст), адрес отправителя, кодировку и др. Для нашего случая добавим следующую строчку заголовков(<b>headers </b>)с указанием кодировки:<br> $to = "pupkin@rambler.ru "; //Здесь укажите свой адрес<br> $headers = "Content-type: text/plain; charset=utf-8";<br> $subject = "Сообщение с вашего сайта";<br> $message = "Имя пославшего: $name \nЭлектронный адрес: $email \nСообщение: $mess";<br> $send = mail ($to, $subject, $message, $headers);</p> <p>Так же неплохо сообщить браузеру о правильной кодировке добавлением в РНР-страницу отправки формы обратной связи (см. "Создание формы обратной связи ") заголовка с мета-тегом<br> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />.</p> <p>Проблемы с кодировкой возникают и в том случае, если вы используете на странице скрипты для вывода какого-либо текста, например, бегущей строки, даты и т.п. Для изменения кодировки скрипта можно воспользоваться <b><a href="/kak-iz-wordpad-sdelat-microsoft-word-chem-otlichaetsya-microsoft-word-ot/">Microsoft Word</a> </b>. Для этого откройте документ, задайте нужную кодировку, если он выводится неверно (как это сделать, смотрите в "Справке Word"), а затем сохраните его следующим путем: <b>Файл - Сохранить как - Обычный текст - Сохранить </b>. В открывшемся окне вы можете задать необходимую кодировку, совпадающую с кодировкой вашей страницы.<br></p> <p>К сожалению, описанные <a href="/chertezhi-moshchnoi-tv-antenny-neuverennogo-priema-prosteishii-variant-antenny/">простые приемы</a> указания кодировки не всегда избавляют от ошибок при её определении. Иногда требуется серьезное хирургическое вмешательство в работу РНР-машины. <a href="/kak-kopirovat-mp3-s-diska-na-kompyuter-kak-skinut-nuzhnuyu/">Нужную информацию</a> о таких операциях вы без труда, но при наличии желания, найдете в справочнике под названием "Интернет" - мышь вам в руки!</p> <p><i> 18.03.2011 г. </i></p> <ul> Ещё статьи по теме "Создание, оптимизация и раскрутка сайта": </ul> <ol><li>Возьмём в качестве примера наш сайт: www.vashmaster.ru</li> <li>Все тексты сайта написаны и размещены на сайте в кодировке <b>"windows-1251" </b> и об этом браузеру не сообщается</li> <li>Сервер хостинга автоматически по умолчанию отправляет следующий заголовок:<br><b>Content-Type: text/html; charset=utf-8 </b></li> </ol><p>При подобном несовпадении в реальной кодировке сайта и информации о кодировке в заголовке, отправляемом сервером, возникнут проблемы отображения страниц сайта в браузере посетителей.</p> <h2>Правильная кодировка - это очень важно!</h2> <p>Попробуем объяснить почему.</p> <p>При описанных выше настройках, браузер пользователя не сможет автоматически определить в какой же кодировке написаны тексты на просматриваемом сайте. И скорее всего будет отображать страницы в нечитаемых "кракозябрах". Если вы столкнулись с подобным "недопониманием" между браузером и вашим сайтом, то в срочном порядке необходимо принять соответствующие меры. Иначе, это с большой вероятностью приведёт к череде серьёзных проблем.</p> <p><b>Во-первых </b>, в подобных условиях и настройках сайта, посетителям придётся постоянно в ручную (методом подбора) указывать браузеру кодировку для отображения сайта. Для этого потребуется сделать несколько лишних кликов мышкой. Но согласитесь, не каждому понравится делать лишних 2-3 клика мышкой, чтобы просто увидеть информацию на странице в читабельном виде . Тем более, что очень многие даже и не знают не только как сменить кодировку отображения в настройках браузера, но и что такое кодировка вообще! Большинство посетителей могут решить что сайт заброшен владельцем или кем-нибудь взломан, и постараются на него больше не возвращаться.</p> <p><b>Во-вторых </b>, при неоднозначном определении кодировки страниц сайта, <b>поисковые системы могут не правильно индексировать текстовое содержимое сайта </b>. Что в свою очередь несёт серьёзные проблемы с трафиком пользователей с поисковых систем. Конечно, некоторые поисковые системы могут пытаться по содержимому страниц как-то определить их правильную кодировку, но намного легче от этого не становится. Как правило, проблема всё равно остаётся.</p> <p>Надеюсь, вы осознали, что проблемы с кодировкой могут стать очень серьёзной преградой в функционировании сайта, в его развитии и привлечении на него постоянных посетителей.</p> <p>Для того, чтобы подобных проблем с кодировкой не возникало, нужно сделать соответствующие настройка как на сервере хостинга, так и на страницах сайта.</p> <p>Настройки сайта должны быть такими, чтобы любой браузер или любой робот поисковой системы могли ОДНОЗНАЧНО определить в какой кодировке передаётся информация с сайта! </p> <h2>Решение проблемы с кодировкой сайта</h2> <p>Мы уже заметили, что все тексты на нашем сайте написаны и передаются в браузер посетителю сайта в кодировке "windows-1251". Что же сделать, дабы сервер, на котором размещён наш сайт, передавал браузеру в заголовке <a href="/programma-dlya-bekapa-failov-bekap-po-umnomu-vybiraem/">правильную информацию</a> о кодировке? Давайте действовать по порядку...</p> <p>1. <b>Чтобы не зависеть от настроек сервера </b>, на всех страницах сайта прямо в коде HTML нужно, используя мета-тег, явно прописать следующую директиву:</p> <p><b><meta http-equiv="content-type" content="text/html; charset=windows-1251"> </b></p> <p>Разместить её необходимо на всех страницах, желательно, сразу же после открывающегося тега <head>. Это позволит браузеру автоматически в момент загрузки и интерпретации страницы выбрать правильную кодировку отображения в соответствии с полученной директивой! Одной этой директивы должно быть достаточно для решения нашей проблемы. Но так задумывалось в теории. А на практике, этой директивы не всегда достаточно. В редких случаях, но бывает так, что браузер в качестве кодировки для отображения страницы выбирает не ту, что указана в директиве на самой странице, а ту, что была передана в заголовке от сервера! И если указанная в двух местах информация о кодировке не совпадает, то проблема может остаться.</p> <p>2. <b>Чтобы сервер отдавал в своём ответе правильную информацию о кодировке </b>, необходимо в корне своего сайта создать файл <b>.htaccess </b> и прописать в нём директиву:</p> <p><b>AddDefaultCharset <b>windows-1251 </b> </b></p> <p>Тогда сервер продолжит по умолчанию отсылать заголовок о кодировке, но название кодировки будет совпадать с действующей на самом сайте. Ни каких несовпадений в названиях уже не будет.</p> <p>Если файл <b>.htaccess </b> уже существует на вашем сервере, то просто добавьте указанную директиву, например, в самом начале. И ни в коем случае не удаляйте без надобности уже существующую в нём информацию!</p> <p>Вот и всё решение проблемы. Согласитесь, всё это не так сложно?! Зато очень полезно для профилактики всевозможных проблем с пресловутой кодировкой.</p> <p>Выполнив последовательно две перечисленные выше рекомендации, браузеры уже точно не смогут ошибиться в <a href="/avtomaticheskii-vybor-polzovatelya-windows-7-windows-avtomaticheskii/">автоматическом выборе</a> правильной кодировки отображения информации на вашем сайте. Всё-таки мы указали однозначно, правильно и даже в двух разных директивах информацию о кодировке!</p> <h2>Особые ситуации</h2> <h3><b>Ситуация первая </b></h3> <p>Создатели сайтов, а чаще даже сами заказчики начинают самовольно и необдуманно вносить определённые доработки на сайт, размещать тексты так как им вздумается ну и т. д. Вплоть до того, что в результате на сайте могут оказаться <b>разделы с информацией в <a href="/kodirovka-utf-8-v-excel-chto-delat-esli-csv-fail-eksporta-ne-pokazyvaet/">разных кодировках</a> </b>. Не можем сказать, что это правильный подход, но будем отталкивать оттого, что так бывает и всё тут. В таком случае, даже если мы выполним выше перечисленные две рекомендации, всё равно может возникнуть ситуация, когда сервером будет выдаваться информация об одной кодировке, а в коде HTML страницы будет явно прописана уже другая кодировка. В подобном случае, пожалуй, наиболее <a href="/ne-rabotaet-zaryadka-na-macbook-pro-macbook-ne-zaryazhaetsya-prichiny-problemy-i/">простым решением</a> будет следующее.</p> <p>Пропишите в файл <b>.htaccess </b> директиву:</p> <p><b>AddDefaultCharset Off </b></p> <p>При использовании данной директивы, сервер просто совсем не будет отсылать заголовок с информацией о кодировке передаваемой страницы. Тогда браузеры будут отталкиваться от данных по кодировке, которые указаны явно в коде HTML на самих страницах сайта. При этом на одной странице данные могут быть в кодировке <b>windows-1251 </b>, а на другой странице, например в <b>utf-8 </b>. Главное, не забыть указать на этих страницах соответствующие мета-теги с информацией о правильной кодировке для распознавания и отображения текста браузером.</p> <p>Подобное решение хоть и самое простое, но, пожалуй, не самое оптимальное и правильное. По-хорошему, нужно всю информацию на сайте и во всех разделах сайта размещать в одной и той же кодировке! И если есть несколько страниц в другой кодировке, то лучше обновить в них информацию переконвертировав все тексты в требуемую кодировку.</p> <h3><b>Ситуация вторая </b></h3> <p>Как известно, большинство сайтов при генерации страниц часть данных выбирают из базы данных, например, MySQL (если сайт написан на <a href="/yazyk-php-s-nulya-pochemu-imenno-php-ispolzuite-buferizovannyi/">языке PHP</a>). Часто, <b>при </b><b>переносе сайта с одного хостинга на другой </b>, могут возникнуть проблемы из-за несовпадения кодировок между данными, хранящимися в базе <a href="/sozdanie-bd-v-mysql-kak-sozdat-bazu-dannyh-v-mysql-sozdanie-bazy-dannyh/">данных MySQL</a>, и данными, хранящимися, например, непосредственно в шаблонах сайта . Таким образом, может возникнуть такая ситуация, что при формировании одной страницы на ней могут оказаться данные в разных кодировках. Пожалуй, это одна из самых грубых возможных ошибок с кодировкой на сайте и её нужно решать сразу же. Иначе, потом могут возникнуть дополнительные сложности при наполнении и редактировании сайта. </p> <p>Решение подобных разногласий с данными, хранящимися в базе данных, достигается правильной явной установкой настроек кодировки при подключении к базе данных и до выполнения выборок данных из неё. Например, если данные на сайте у нас хранятся в кодировке windows-1251, то и читать данные из базы мы должны в этой же кодировке. Для этого, после выполнения подключения к базе с помощью функции PHP mysql_connect() (или mysql_pconnect()) выполните следующий <a href="/vyzov-sql-zaprosa-iz-koda-vba-access-kak-poluchit-dannye-iz-zaprosa-sql-v-microsoft-access-vba/">запрос SQL</a>:</p> <p><b>mysql_query("SET NAMES cp1251"); </b></p> <p>Данный запрос, сообщает серверу базы данных MySQL, что все данные хранятся и должны передаваться в кодировке cp1251 (именно такое название кодировки используется в MySQL вместо упоминаемого ранее названия windows-1251, которое используется при передачи данных HTML).</p> <p>Но лучше всего изменить кодировку данных в <a href="/mysql-vosstanovlenie-iz-dampa-cherez-konsol-delaem-damp-bazy-mysql/">базе MySql</a> на ту, которая используется и на самом сайте. Тогда серверу базы данных не придётся выполнять лишнюю операцию по перекодировки данных из одного формата в другой.</p> <h3>На заметку</h3> <p>Если вы посетили сайт, у которого по каким-либо причинам сбилась кодировка, но вам очень нужно получить на нём <a href="/kak-udalit-baidu-s-kompyutera-kak-udalit-baidu-poleznaya-informaciya-baidu-chto/">полезную информацию</a> (не дожидаясь, когда разработчики сайта выполнят вышеперечисленные нами рекомендации), то следует в ручную в настройках браузера указать правильную кодировку страницы. Сделать это можно обычно через основное меню браузера: <b>Вид </b> -> <b>Кодировка </b> -> Далее выберите из списка название предполагаемой кодировки страницы. Возможно, чтобы угадать, вам придётся проделать данную процедуру не один раз, выбирая то одно, то другое название из списка кодировок. Чтобы ускорить процесс подбора, рекомендуем перебирать их в следующем порядке: <b>Кириллица (Windows-1251) </b>, <b>Кириллица (</b><b>UTF-8) </b>, <b>Кириллица (KOI </b><b>8-R) </b>. Это наиболее часто используемые кодировки на сайтах в Рунете.</p> <p>Если последовательность бит не выглядит разумной(с точки зрения человека), то это случай, когда документ скорее всего был неверно сконвертирован в определенный момент. К примеру мы берем текст ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ, и, не придумав ничего лучше, сохраняем его в UTF-8. Текстовый редактор предположил, что он правильно прочитал текст с кодировкой Mac Roman и теперь его надо сохранить в другой кодировке. В конце концов, все эти символы валидны в Unicode. В смысле, в Unicode есть пункт для É, для G, и так далее. Так что мы просто сохраняем его в UTF-8: </p><blockquote>11000011 10001001 01000111 11000011 10001001 11000011 10101100 11000011 10001001 01010010 11000011 10000101 01011011 11000011 10001001 01100110 11000011 10001001 01000010 11000011 10001001 11000011 10101100 11000011 10001001 01001111 11000011 10000111 11000011 10010101 11000011 10101100 11000011 10010100 11000011 10000111 11000010 10110101 11000011 10000111 11100010 10001001 10100000 11000011 10000111 11000010 10111011 11000011 10000111 11000010 10100010 <br></blockquote><br><p>Вот так теперь текст ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ представляется последовательностью бит UTF-8. Эта битовая последовательность совершенно оторвана от того, что было в изначальном документе. В какой бы кодировке мы не открывали эту последовательность, нам ни за что не видать исходный текст エンコーディングは難しくない. Он просто потерян. Его можно было бы восстановить, знай мы изначальную кодировку Shift-JIS и то, что мы расценили текст как Mac Roman, а затем сохранили его в UTF-8. Но такие чудеса редко встречаются. </p><p>Множество раз конкретная битовая последовательность оказывается неверной в конкретной кодировке. Если бы мы попытались открыть изначальный документ в ASCII, то увидели бы, что часть символов распозналась, а часть – нет. Программа, который вы пользуетесь, могла бы решить просто выбросить байты, которые не подходят под текущую кодировку, или заменить их на знаки вопроса. Или на специальный символ замены в Unicode: � (U+ FFFD). Если после процедуры изъятия неподходящих символов вы сохраните документ, то потеряете их навсегда. </p><p>Если вы неверно угадали кодировку, а потом сохранили ее еще в одну, то вы испортите документ. Можно пытаться исправить его, но эти попытки обычно успехом не оканчиваются. Магия с битовым сдвигом обычно остается неработающей магией: как мертвому припарки. </p><h5>И как же правильно менять кодировки?</h5><p>Это правда просто! Нужно знать кодировку конкретного кусочка текста(битовой последовательности) и применить ее для расшифровки. Это все, что нужно сделать. Если вы пишете программу, которая принимает от пользователя текст, определите в какой кодировке она будет это делать. Любое текстовое поле должно знать, в какой кодировке оно принимает данные. Для любого типа файла, который пользователь может загрузить в программу должна быть определена кодировка. Или должен существовать способ спросить об этом пользователя. Информацию может предоставлять формат файла или пользователь(большинство из них вряд ли знают, пока конечно не дочитают статью). </p><p>Если нужно перегнать текст из одной кодировки в другую, применяйте <a href="/kak-sdelat-kabelnyi-internet-cvetovye-shemy-raspinovki/">специальные инструменты</a>. Конвертация – утомительный труд по сравнению двух кодовых страниц и решению, что символ 152 в кодировке А совпадает с символом 4122 в кодировке B с последующим изменением битов. Не нужно изобретать этот велосипед: в каждом распространенном языке программирования есть абстрактные от битов и кодовых страниц инструменты для конвертации текста из кодировки в кодировку.</p><p>Скажем, ваше приложение должно принимать файлы в GB18030, но внутри вы работает в UTF-32. Инструмент iconv может в одну строку сделать конвертацию: iconv("GB18030", "UTF-32", $string). Символы останутся неизменным, несмотря на то, что битовое представление измененилось.</p><blockquote>character GB18030 encoding UTF-32 encoding<br> 縧 10111111 01101100 00000000 00000000 01111110 00100111 </blockquote><p>Вот и все. Содержание строки в его человеческом понимании не изменилось, но теперь это правильная строка в UTF-32. Если вы продолжите работать с ней в UTF-32, у вас не будет никаких проблем с нечитаемыми символами. Однако, как мы обсуждали ранее, не все кодировки способны отображать все символы. Невозможно закодировать символ 縧 в любой из кодировок для европейских языков. И может случится нечто ужасное.</p><h5>Все в Unicode</h5><p>Именно поэтому не существует оправдания в 21 веке не использовать Unicode. Некоторые специализированные кодировки для европейских языков могут более производительны, чем Unicode для конкретных языков. Но пока вам не приходится работать с терабайтами специального текста(а это ОЧЕНЬ много), вам не о чем беспокоиться. Проблемы, вытекающие из-за несовместимости кодировок, гораздо страшнее, чем потерянный гигабайт. И этот аргумент станет только весомей с ростом и удешевлением хранения данных и ширины канала. </p><p>Если системе нужно работать с иными кодировками, сконвертируйте текст в Unicode прежде всего, и перегоните обратно, если его нужно куда-нибудь вывести. Иначе придется очень внимательно следить за каждым случаем обращения к данным и проводить необходимые конвертации, если это возможно без потери информации.</p><h5>Счастливые случайности</h5><blockquote><i>У меня был сайт подключенный к БД. Мое приложение обрабатывала все как UTF-8 и в БД хранила его так, и все было супер, но когда я зашел в админку БД, я ничего не мог понять. </i><br> - анонимный быдлокодер </blockquote><p>Возникают ситуации, когда кодировки обрабатываются неверно, но все по прежнему работает нормально. Часто бывает, что кодировка базы данных выставлена в latin-1, а приложение работает с UTF-8(или любой другой). Вобщем-то, любая комбинация 1 и 0 допустима в однобайтной latin-1. Если база данных получает от приложения данные вида 11100111 10111000 10100111, то оно с радостью сохраняет их, думая, что приложение имело ввиду 縧. Почему бы и нет? Позже бд возвращает те же самые биты приложению, которое счастливо, ведь получило символ UTF-8 縧, который и задумывался. Но интерфейс администрирования бд знает, что используется latin-1, и вот результат: ничего не возможно понять. <br> Глупец просто выиграл лотерею, хотя звезды были не на его стороне. Любая операция над текстом в бд может сработать, но может и выполниться не как задумано, так как бд неправильно воспринимает текст. В <a href="/microsoft-excel---poleznye-sovety-bystro-dobavit-novye-dannye-v-diagrammu/">худшем случае</a>, бд ненароком уничтожит весь текст, выполняя произвольную операцию 2 года спустя после установки из-за неверной кодировки(и конечно, никакого тебе бэкапа).</p><h5>UTF-8 и ASCII</h5><p>Гениальность UTF-8 в бинарной совместимости с ASCII, которая является де-факто основой для всех кодировок. Все символы ASCII занимают максимум байт в UTF-8 и используют те же биты, что и в ASCII. Иными словами, ASCII может быть отражено 1:1 в UTF-8. Любой символ не из ASCII занимает 2 или более байт в UTF-8. Большинство языков программирования, использующих ASCII в качестве кодировки исходного кода, позволяет включать текст в UTF-8 прямо в текст:</p><p>Сохранение в UTF-8 даст последовательность:</p><blockquote>00100100 01110011 01110100 01110010 01101001 01101110 01100111 00100000<br> 00111101 00100000 00100010 11100110 10111100 10100010 11100101 10101101<br> 10010111 00100010 00111011 </blockquote><p>Только 12 байт из 17(те, что начинаются с 1) являются символами UTF-8(2 символа по 3 байта). Прочие символы находятся в ASCII. Парсер прочитает следующее:</p><blockquote>$string = «11100110 10111100 10100010 11100101 10101101 10010111»; </blockquote><p>Парсер воспринимает все за кавычкой как последовательность бит, которую нужно трактовать как есть, все, вплоть до другой кавычки. Если вы просто выведете эту последовательность, вы выведете текст в UTF-8. Не нужно делать ничего больше. Парсеру не нужно специально поддерживать utf-8, нужно просто воспринимать строки буквально. Простые парсеры могут поддерживать Unicode именно так, на самом деле не поддерживая Unicode. Однако многие языки программирования явно поддерживают Unicode. </p><h5>Кодировки и PHP.</h5><p>PHP не поддерживает Unicode. Правда, он поддерживает его достаточно хорошо. Предыдущий параграф показывает, как включать символы UTF-8 прямо в текст программы без каких-либо проблем, ибо UTF-8 обратно совместима с ASCII, и это все, что нужно PHP. Однако утверждение, что «PHP не поддерживает Unicode» истинно, ибо вызывает множество затруднений в сообществе PHP.</p><h6>Ложные обещания</h6><p>Одной моей мозолью стали функции utf8_encode и utf8_decode. Я часто вижу глупости наподобии «Чтобы использовать Unicode в PHP, нужно вызвать utf8_encode для вводимого текста и utf8_decode для выводимого». Эти две функции обещают некую автоматическую конвертацию текста UTF-8, которая якобы обязательна, ибо «PHP не поддерживает Unicode». Если вы читаете эту статью не по диагонали, то знаете, что</p><ol><li>Ничего специфического нет в UTF-8</li> <li>Вы не можете закодировать текст в UTF-8 постфактум</li> </ol><p>Поясню пункт 2: любой текст уже чем-то закодирован. Когда вы вставляете строки в исходный код, они уже имеют кодировку. Точнее, ту кодировку, которую сейчас использует ваш <a href="/luchshie-tekstovye-redaktory-dlya-windows-tekstovye-redaktory-dlya-windows/">текстовый редактор</a>. Если вы получаете их из бд, они уже закодированы. Если вы читаете их из файла… уже знаете, да?</p><p>Текст либо закодирован в UTF-8, либо не закодирован. Если нет, то он закодирован в ASCII, ISO-8859-1, UTF-16 или как-нибудь еще. Если он не в UTF-8, но предполагается, что он содержит «UTF-8 символы», то у вас когнитивный диссонанс. Если текст все же содержит нужные символы, закодированные в UTF-8, то он в UTF-8. </p><p>Так что же, черт возьми, делает utf8_encode? </p><blockquote>«Переводит строку ISO-8859-1 в кодировку UTF-8» </blockquote><p>Ага! Автор хотел сказать, что функция конвертирует текст из ISO-8859-1 в UTF-8. Вот она для чего. Такое ужасное название ей наверно дал какой-нибудь непредусмотрительный европеец. Тоже самое касается и utf8_decode. Эти функции неприменимы ни для чего, кроме конвертации из ISO-8859-1 в UTF-8. Если вам нужна другая пара кодировок, используйте iconv.<br> utf8_encode – это вам не <a href="/how-to-cut-an-object-in-photoshop-using-the-magic-wand-and-pen-tools-how-to-cut-in-photoshop-methods-for-extracting-objects-in-photoshop/">волшебная палочка</a>, которой нужно махать над каждым словом потому что «PHP не поддерживает Unicode». Она вызывает больше проблем, чем решает – скажите спасибо тому европейцу и невежам-программистам.</p><h6>Нативный-шмативный</h6><p>Так что имеют ввиду, когда говорят, что язык поддерживает Unicode? Важно, предполагает ли язык, что один символ занимает один байт, или нет. Так, PHP позволяет получить доступ до выбранного символа, трактуя строку как символьный массив:</p><p>Если $string имеет однобайтную кодировку, то она отдаст нам первый символ. Но только потому, что «character» совпадает с «byte» в однобайтной кодировке. PHP просто отдает первый байт без единой мысли о символах. Строки для PHP – не более, чем последовательности байт, ни больше, ни меньше. Эти ваши «читаемые символы» - не более, чем выдумка человека, PHP на них наплевать.</p><blockquote>01000100 01101111 01101110 00100111 01110100<br> D o n " t<br> 01100011 01100001 01110010 01100101 00100001<br> c a r e ! </blockquote><p>Тоже касается и многих стандартных функций, таких как substr, strpos, trim и прочих. Поддержка прекращается там, где кончается соответствие между байтом и символом:</p><blockquote>11100110 10111100 10100010 11100101 10101101 10010111<br> 漢 字 </blockquote><p> $string для указанной строки отдаст опять же только первый байт, равный 11100110. Другими словами, третий байт символа 漢. Последовательность 11100110 неверна для UTF-8, так что строка теперь тоже неверна. Если вам тоже так кажется, можете попробовать другую кодировку, в которой 11100110 будет каким-нибудь допустимым <a href="/programma-generiruet-paroli-dlinoi-10-simvolov-generator-sluchainyh/">случайным символом</a>. Можете веселиться, только не на боевом сервере.</p><p>Вот и все. «PHP не поддерживает Unicode» означает, что большинство функций в языке предполагают, что один байт равен одному символу, что ведет к обрезке многобайтных символов или неверному подсчету длины строки. Это не означает, что вы не можете использовать Unicode в PHP, или что любой текст надо прогонять через utf8_encode, или еще какую-нибудь глупость.</p><p>К счастью, существует специальное расширение, которое добавляет все важные <a href="/peremennyh-v-sostav-strokovyh-vyrazhenii-mogut-vhodit/">строковые функции</a>, но с поддержкой многобайтных кодировок. mb_substr($string, 0, 1, ‘UTF-8’) на вышеупомянутой строке совершенно правильно вернет последовательность 11100110 10111100 10100010, соответствующую символу 漢. Из-за того, что функции нужно думать о том, что она делает, ей нужно передать кодировку. Поэтому эти функции принимают параметр $encoding. К слову, кодировку можно задать глобально для всех функции mb_ с помощью mb_internal_encoding. </p><h6>Употребление и злоупотребление обработкой ошибок PHP</h6><p>Вся проблема (не-)поддержки Unicode в PHP в том, что интерпретатору плевать. Последовательности байт, ха. Нет дела до того, что они значат. Не делается ничего, кроме хранения строк в памяти. У PHP даже понятия такого нет – кодировка. И пока не нужно манипулировать строками, это и не важно. Делается работа с последовательностями байт, которые могут быть всопринятыми кем-то как символы. PHP требует от вас только сохранять исходный код в чем-нибудь, совместимом с ASCII. <a href="/xml-potokovyi-parser-php-dlya-chego-nuzhny-xml-parsery-i-chem-oni-mogut-byt/">Парсер PHP</a> ищет конкретные символы, которые говорят ему что делать. 00100100 говорит: «объяви переменную», 00111101 – «присвой», 00100010 – начало или конец строки и т.д. Все, что не важно парсеру, воспринимаются как литералы байтовых последовательностей. Это касается и всего, что заключено в кавычки. Это значит:</p><ol><li>Вам не удастся сохранить исходник с PHP в несовместимую с <a href="/reshenie-problem-nepravilnoi-kodirovkoi-veb-stranicy-osnova-osnov/">ASCII кодировку</a>. Например в UTF-16 знак кавычик кодируется как 00000000 00100010. Для PHP, который все воспринимает как ASCII, это NUL-байт, за которым следует кавычка. PHP наверно бы икал на каждый символ оказывался бы NUL.</li> <li>Вы можете сохранить PHP в совместимую с ASCII кодировку. Если первые 128 пунктов кодировки совпадают с ASCII, PHP съест их. Все <a href="/smailik-inoplanetyanin-v-ramke-chto-znachit-smaily-iz-simvolov-znachenie/">значимые символы</a> для PHP лежат в пределах первых 128 пунктов, определенных ASCII. Если строковые литералы содержат что-то выходящие за этот предел, PHP не обратит внимание. Вы может сохранить исходник в ISO-8859-1, Mac Roman, UTF-8 или любую другую кодировку. Строковые литеры в вашем коде получат ту кодировку, в которой вы сохраняете файл.</li> <li>Любой <a href="/ne-yavlyaetsya-vnutrennei-vneshnei-imya-faila-ne-yavlyaetsya-vnutrennei/">внешний файл</a> для PHP может иметь произвольную кодировку. Если парсеру не надо обрабатывать файл, то он останется довольным. <blockquote>$foo = file_get_contents("bar.txt"); </blockquote><p>Написанное выше просто засунет байты из bar.txt в переменную $foo. PHP не будет пытаться ничего интерпретировать, кодировать или совершать другие махинации с содержимым. Файл может содержать бинарные данные или картинку, PHP все равно.</p></li> <li>Если внешняя и внутрення кодировки должны совпадать, то они действительно должны. Обыденным случаем является локализация: в коде вы пишете что-то типа echo localize(‘Foobar’), а во внешем файле это:<blockquote>msgid «Foobar»<br> msgstr "フーバー"<br></blockquote><p>Обе строки Foobar должны иметь идентичное битовое представление. Если исходный код в ASCII, а локализционный – в UTF-16, вам не повезло. Нужно проводить дополнительную конвертацию.</p></li> </ol><p>Проницательный читатель может спросить, скажем, можно ли сохранить последовательно байт UTF-16 в литерал <a href="/ne-raspoznan-format-ishodnyh-dannyh-jpg-rasshirenie-faila-jpeg/">исходного файла</a> в ASCII, и ответ будет всегда такой: конечно.</p><blockquote>01100101 01100011 01101000 01101111 00100000 00100010<br> e c h o "<br> 11111110 11111111 00000000 01010101 00000000 01010100<br> (UTF-16 marker) U T<br> 00000000 01000110 00000000 00101101 00000000 00110001<br> F - 1<br> 00000000 00110110 00100010 00111011<br> 6 " ; </blockquote><p>Первая строка и последние 2 байта – из ASCII. Остальное представлено в UTF-16 2 байтами на символ. Ведущие 11111110 11111111 на второй строке – это маркер начала текста в UTF-16(требует по стандарту, PHP об этом ни черта не слышал). Этот скрипт выводит строку “UTF-16”, закодированную в UTF-16, потому что просто выводит байты между двух кавычек, что и выливается в текст «UTF-16», закодированный в UTF-16. C другой стороны, исходник не является полностью корректным ни в ASCII, ни в UTF-16, так что можете открыть редактор и повеселиться.</p><h6>Итого</h6><p>PHP поддерживает Unicode, или точнее, любую кодировку довольно точно до тех пор, пока вы можете заставить парсер выполнять его работу, а разработчика – понимать, что он делает. Нужно быть внимательным только при работе со строками: деление, удаление пробелов, подсчет и все другие операции, требующие работать с символами, а не байтами. Если ничего не делать со строками, кроме чтения и вывода, то вряд ли возникнут проблемы, которых нет в других языках.</p><h5>Языки с поддержкой кодировок</h5><p>Так что же тогда для языка значит поддерживать Unicode? Javascript например поддерживает Unicode. На самом деле любая строка в Javascript кодирована в UTF-8. И это единственная кодировка, с которой работает Javascript. Вам просто не получить в Javascript строку не в UTF-8. Javascript поклоняется Unicode в такой степени, что в ядре языка просто нет инструментов для работы с другой кодировкой. Раз уж Javascript чаще всего исполняется в браузере, у вас не возникает проблем: браузер способен исполнить тривиальную логику кодирования и декодирования ввода-вывода.</p><p>Прочие языки просто поддерживают кодировки. Внутренняя работа проводится в какой-то одной кодировке, часто в UTF-16. Но это значит, что им нужно подсказывать в какой кодировке текст, или они сами будут пытаться ее определить. Необходимо указывать в какой кодировке сохранен исходный код, в какой кодировке сохранен файл, который будет прочитан, в какой кодировке нужно осуществлять вывод. Язык проведет конвертацию налету, если будет указано, что нужно использовать Unicode. Они делают все то, что в PHP нужно делать в полуавтоматическом режиме где-то на втором плане. Не лучше и не хуже, чем в PHP, просто по-другому. Хорошая новость в том, что строковые функции наконец просто работают, и вам не нужно думать, содержит ли строка многобайтные символы или не содержат, какие функции выбирать для работы и прочие вещи, которые нужно было бы делать в PHP.</p><h5>Дебри Unicode</h5><p>Раз уж Unicode решает столько различных проблем и работает в множестве различных сценариев, приходится платить за это копанием в дебрях. К примеру, в <a href="/chto-takoe-standart-unicode-blizhe-k-delu-opredelenie-podderzhki-yunikoda/">стандарте Unicode</a> содержится инфорация о решении таких проблем, как унификации иеороглифоф ЯКК . Множество символов, общих для Японии, Китая и Кореи, изображены немного по разному. Или проблемы конвертации символов из нижнего регистра в верхний, наоборот или туда-обратно, которая оказывается не всегда такой простой, как с кодировками западно-европейских языков. Некоторые символы могут быть представлены разными пунктами. Буква ö к примеру может быть представлена пунктом U+00F6(«ЛАТИНСКАЯ МАЛЕНЬКАЯ БУКВА О С ДИЕРЕЗИСОМ») или как два пункта U+006F(«МАЛЕНЬКАЯ БУКВА O») И U+0308(«ПОДСТАВЛЯЕМЫЙ ДИАРЕЗИС»), что значит буква o с ¨. В UTF-8 это либо 2 байта, либо 3 байта, которые в обоих случаях представляют собой нормальный символ. Поэтому есть правила нормализации в стандарте, т.е. как конвертировать эти формы из одной в другую. Это и многое другое находится вне материалов статьи, но об этих моментах нужно знать. </p><h5>Опять ниасилил!</h5><ol><li>Текст – это всегда последовательность бит, которую нужно переводить на естественный язык с помощью таблиц. Неверная таблица – неверный символ.</li> <li>Нельзя работать напрямую с текстом – вы всегда работаете с битами, которые свернуты в абстракции. Ошибки связаны с ошибками в одной из абстракций.</li> <li>Системы, передающие друг другу информацию всегда должны указывать рабочую кодировку. Сайт например говорит браузеру, что он отдает информацию в UTF-8.</li> <li>В наше время UTF-8 обратно совместим с ASCII, несмотря на то, что может кодировать практически любой символ, и тем не менее относительно эффективен в большинстве случаев. Другие кодировки тоже находят применение, но должна быть серьезная причина, чтобы мучиться с кодировками, которые поддерживают только часть Unicode.</li> <li>С проблемой соответствия байта и символа должны разбираться оба: и программа, и программист.</li> </ol><p>Теперь нечего оправдываться, когда вы вновь испортите текст.</p><p>Теги: Добавить метки</p> <p>Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье мы разобрали <span>создание таблиц в html </span> . В данной статье я бы хотел рассказать о проблеме, с которой вы обязательно столкнетесь (если ещё не столкнулись) в своей практике. А проблема эта связана с <b>кодировкой на сайте </b>. Нередко бывает такая ситуация: ты сидишь, что-то придумываешь, в итоге твои мысли выражаются в написанный код. Открываешь своё творение в браузере, а там написана полная ерунда, или как обычно данную ерунду называют — "кракозябры" . Тут очевидно одно, что <b>проблема с кодировкой на сайте </b>. Скорее всего у вас по умолчанию стоит кодировка <span>windows-1251 (кирилица) </span>, а браузер пытается открыть ваш файл в кодировке utf-8 . Кратко о том, что такое кодировка. Кодировка — это некая таблица, которая каждому символу ставит в соответствие какой-то <a href="/programmirovanie-v-mashinnyh-kodah-i-na-yazyke-assemblera/">машинный код</a>. Соответственно наши русские буквы в одной кодировке имеют один код, в других — другой код. Друзья, используйте везде кодировку utf-8 и будет вам счастье. По-другому utf-8 называется Юникод .</p> <p>Давайте создадим тестовый документ в Notepad++ и запишем следующий код.</p><p> <html> <meta charset="utf-8"/> <head><title>Проблемы с кодировкой

Тестируем проблемы с кодировкой

В меню Notepad++ проверьте, чтобы наверху стояло "Кодировки" — "Кодировать в ANSI". Мы сейчас с вами искусственно создадим проблему с кодировкой. Попробуйте сейчас открыть данный файл в браузере. Мы увидим иероглифы. Дело здесь в том, что мы создали наш файл в кодировке ANSI (кирилица), а браузеру сообщили, что наш файл в кодировке utf-8 () .

Причины, по которым возникают проблемы с кодировкой на сайте :

1) Неправильное значение атрибута charset у мета-тега.

2) В меню Notepad++ проверьте, чтобы кодировка файла была utf-8. Это нужно сделать "Кодировки" — "Кодировать в UTF-8 (без BOM)". В интернете можно найти определение, что такое "BOM", но оно малопонятное. Как я понял, в начале документа, ставится неразрывный пробел с нулевой шириной. Он нам не нужен, поэтому всегда ставьте "без BOM".

3) Бывает такое, что первые два пункта выполнены, но на страницах сайта всё равно появляется ерунда. Здесь проблема может быть в настройках сервера,т.е. хостинг напрямую передаёт заголовки для наших файлов и выставляет кодировку по умолчанию. Давайте попробуем отучить его это делать. В корневой директории сайта должен быть файл .htaccess . С помощью этого файла можно вносить корректировки в работу хостинга. Если данного файла у вас нет, то его нужно создать. Удобно это сделать в редакторе Notepad++. В данном файле необходимо написать следующий код:

AddDefaultCharset UTF-8

Данной инструкцией мы говорим серверу, что у нас кодировка по умолчанию "utf-8". Если это не помогло, то нужно написать в этом же файле следующий код:

Charsetdisable on AddDefaultCharset Off

Здесь мы пытаемся сказать серверу, что нам не нужна кодировка по умолчанию. Если после данных махинаций ничего не помогло, то необходимо писать хостеру и решать данную проблему с ним. Возможно он что-то подскажет.

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

КУРСОВАЯ РАБОТА

КОДИРОВАНИЕ ИНФОРМАЦИИ В ЭВМ

1 Теоретическая часть

1.1 Основные понятия кодирования и декодирование

1.3 Кодирование символьной информации

1.7 Алгоритм Хаффмана

1.9 Помехоустойчивые коды

1.10 Теоремы Шеннона

2 Практическая часть

Программа на кодирование информации

Приложение

Заключение

Введение

Теория кодирования близка к древнейшему искусству тайнописи - криптографии. Над разработкой различных шифров трудились многие известные ученые: философ Ф. Бэкон, математики Д. Кардано, Д. Валлис. Одновременно с развитием методов шифровки развивались приемы расшифровки, или криптоанализа.

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

Грандиозные достижения человечества - письменность и арифметика - есть не что иное, как система кодирования речи и числовой информации. Информация никогда не появляется в чистом виде, она всегда как-то представлена, как-то закодирована.

Рассмотрим примеры кодирования, с которыми мы сталкиваемся в нашей жизни. На Руси, где леса гасили звук, для передачи срочных сообщений использовался дым костров. Многие африканские племена до сих пор используют специальные барабаны - тамтамы, обмениваясь сообщениями со скоростью звука. До сих пор на флоте используется семафорная азбука, когда каждой букве соответствует определенное положение рук сигнальщика, подчеркиваемое флажками. Но для того, чтобы сообщение было не только принято, но и понято, приходилось предварительно договариваться, что означают, например, два дыма, или последовательность из трех быстрых ударов, или разведенные в стороны руки.

Итак, кроме самого сообщения и способа его передачи, появился еще один компонент - преобразование информации или, по-научному выражаясь, кодирование . Без него никакой передачи информации не состоится.

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

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

Майкл Фарадей в 1831 году сделал открытие, буквально перевернувшее мир: он изобрел способ получения электрического тока. И чуть ли не сразу же электрический ток был использован для передачи сообщений.

На основе теоретических разработок английского ученого Шиллинга, американский изобретатель Сэмюэл Морзе создал и широко внедрил в практику телеграфные аппараты и линии связи. Морзе пришлось создавать язык, отчасти похожий на язык африканского барабанного телеграфа. И электрический ток, и барабан имеют весьма небогатый собственный язык. По барабану можно либо стучать, либо нет. Электрический ток или идет, или его нет. Поэтому и кодировка, предложенная Морзе использовала всего три своеобразные буквы: длинный сигнал (тире), короткий сигнал (точка), нет сигнала (пауза) - для разделения букв. Так, знаменитый сигнал SOS - (Save Our Souls - спасите наши души) кодируется так:

<точка>, <точка>, <точка> - S

<пауза>

<тире>, <тире>, <тире> - O

<пауза>

<точка>, <точка>, <точка> - S

Код Морзе полтора века служил человечеству. Его сигналы пробивались сквозь такие атмосферные помехи, которые глушили любую членораздельную речь. И лишь в последнее время, когда появились спутники связи, он практически не применяется. К сожалению, все ранние попытки сделать машину, понимающую код Морзе, оказались безуспешными. Предложенные варианты оказывались излишне громоздкими, ненадежными и дорогими. Конечно, техника начала века была еще не столь совершенна, как сейчас, но свою роль сыграло и то, что сам по себе код Морзе был весьма сложен для распознавания его автоматами.

В середине нашего века под руководством Алана Тьюринга под Лондоном появились компьютеры, обрабатывающие буквы и цифры, т.е. символьную информацию. Именно там в 1943 году был создан специализированный компьютер, расшифровывающий немецкие военные коды (машина называлась “Колосс”). Тысячи перехваченных за день неприятельских сообщений вводились в память “Колосса”, после чего в поисках соответствия машина перебирала сотни тысяч вариантов, расшифровывая самые сложные коды.

Актуальность: В связи с широким распространением персональных компьютеров не только как средств обработки информации, но также как оперативных средств коммуникации (электронная, телефаксная почта), возникают проблемы, связанные с обеспечением защиты информации от преднамеренных или случайных искажений. Поэтому необходимость кодирования информации имеет большое значение в решении этой проблемы иостаётся актуальной и на сегодняшний день.

Объект: Информационные процессы

Предмет: Кодирование информации

Цель: Разработать программно - методический комплекс “Кодирование информации” декодирование кодирование информации

Задачи :

1. Выделить основные понятия теории кодирования

2. Уточнить способы представления информации в ЭВМ

3. Рассмотреть алгоритмы кодирования (алгоритм Хаффмана, Лемпеля - Зива, Хемминга)

4. Рассмотреть основные виды помехоустойчивых кодов

5. Разработать программно - методический комплекс по кодированию информации

1 Теоретическая часть

1.1 Основные понятия кодирования и декодирования

Рассмотрим ряд определений, использующихся в теории кодирования:

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

Кодирование - перевод информации, представленной посредством первичного алфавита, в последовательность кодов.

Декодирование - операция, обратная кодированию, т.е. восстановление информации в первичном алфавите по полученной последовательности кодов.

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

Примером обратимого кодирования является представление знаков в телеграфном коде при передаче сообщений и восстановление их при приеме.

Примером необратимого кодирования является перевод текста с одного естественного языка на другой (обратный перевод побуквенно обычно не соответствует исходному тексту).

Основными задачами кодирования являются:

1. Обеспечение экономичности передачи информации посредством устранения избыточности

2. Обеспечение надежности (помехоустойчивости) передачи информации

3. Согласование скорости передачи информации с пропускной способностью канала

Соответствие между элементами дискретных сообщений и видом кодирования обеспечивается выбором:

1. Длительности сигналов

2. Длины кодового слова

3. Алфавита знаков и способа кодирования (побуквенного, блочного). Различают побуквенное и блочное кодирование. При побуквенном кодировании каждому знаку внешнего алфавита ставиться в соответствие кодовое слово из знаков внутреннего алфавита. При блочном кодировании слову из знаков внешнего алфавита ставиться в соответствие кодовое слово из знаков внутреннего алфавита.

Чтобы код был обратимым, необходимо:

1) чтобы разным символам входного алфавита А были сопоставлены разные кодовые комбинации;

2) чтобы никакая кодовая комбинация не составляла начальной части какой-нибудь другой кодовой комбинации.

Кодирование информации (иногда говорят -- шифровк а ) - это процесс формирования определенного представления информации. В более узком смысле под термином «кодирование» часто понимают переход от одной формы представления информации к другой, более удобной для хранения, передачи или обработки.

Компьютер может обрабатывать только информацию, представленную в числовой форме. Вся информация (например, звуки, изображения, показания приборов и т. д.) для обработки на компьютере должна быть преобразована в числовую форму. Например, чтобы перевести в числовую форму музыкальный звук, можно через небольшие промежутки времени измерять интенсивность звука на определенных частотах, представляя результаты каждого измерения в числовой форме.

Аналогичным образом на компьютере можно обрабатывать текстовую информацию. При вводе в компьютер каждая буква кодируется определенным числом, а при выводе на внешние устройства (экран или печать) для восприятия человеком по этим числам строятся изображения букв. Соответствие между набором букв и числами называется кодировкой символов .

Как правило, все числа в компьютере представляются с помощью нулей и единиц (а не десяти цифр, как это привычно для людей). Иными словами, компьютеры обычно работают в двоичной системе счисления, поскольку при этом устройства для их обработки получаются значительно более простыми. Ввод чисел в компьютер и вывод их для чтения человеком может осуществляться в привычной десятичной форме, а все необходимые преобразования выполняют программы, работающие на компьютере.

1.2 Способы кодирования информации в ЭВМ

Одна и та же информация может быть представлена (закодирована) в нескольких формах. Двоичное кодирование - один из распространенных способов представления информации. В вычислительных машинах, в роботах и станках с числовым программным управлением, как правило, вся информация, с которой имеет дело устройство, кодируется в виде слов двоичного алфавита. Двоичный алфавит состоит из двух цифр 0 и 1. Цифровые ЭВМ (персональные компьютеры относятся к классу цифровых) используют двоичное кодирование любой информации. В основном это объясняется тем, что построить техническое устройство, безошибочно различающее 2 разных состояния сигнала, технически оказалось проще, чем то, которое бы безошибочно различало 5 или 10 различных состояний.

К недостаткам двоичного кодирования относят очень длинные записи двоичных кодов, что затрудняет работу с ними.

Среди всего разнообразия информации, обрабатываемой на компьютере, значительную часть составляют числовая, текстовая, графическая и аудиоинформация. Познакомимся с некоторыми способами кодирования этих типов информации в ЭВМ.

1.3 Кодирование символьной (текстовой) информации

Основная операция, производимая над отдельными символами текста - сравнение символов.

Множество символов, используемых при записи текста, называется алфавитом. Количество символов в алфавите называется его мощностью.

При сравнении символов наиболее важными аспектами являются уникальность кода для каждого символа и длина этого кода, а сам выбор принципа кодирования практически не имеет значения.

В настоящее время, большая часть пользователей, при помощи компьютера обрабатывает текстовую информацию, которая состоит из символов: букв, цифр, знаков препинания и др. Подсчитаем, сколько всего символов и какое количество бит нам нужно: 10 цифр, 12 знаков препинания, 15 знаков арифметических действий, буквы русского и латинского алфавита, ВСЕГО: 155 символов, что соответствует 8 бит информации.

Суть кодирования заключается в том, что каждому символу ставят в соответствие двоичный код от 00000000 до 11111111 или соответствующий ему десятичный код от 0 до 255.

Для кодирования текстов используются различные таблицы перекодировки.

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

Наиболее популярные таблицы перекодировки: ДКОИ-8, ASCII, CP1251, Unicode, причем тексты, закодированные при помощи одной таблицы не будут правильно отображаться в другой, поэтому важно, чтобы при кодировании и декодировании одного и того же текста использовалась одна и та же таблица. (Базовая таблица кодировки ASCII приведена в таблице 1.1.). Не так давно был предложен новый стандарт символьного кодирования UNICODE , где каждый символ кодируется уже двумя байтами. Он позволяет свободно обмениваться сообщениями по Интернету на любом языке, не выясняя предварительно, понимает ли другой компьютер ваш родной алфавит.

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

Исторически сложилось, что в качестве длины кода для кодирования символов было выбрано 8 бит или 1 байт. Поэтому чаще всего одному символу текста, хранимому в компьютере, соответствует один байт памяти.

1.4 Кодирование числовой информации

Сходство в кодировании числовой и текстовой информации состоит в следующем: чтобы можно было сравнивать данные этого типа, у разных чисел (как и у разных символов) должен быть различный код. Основное отличие числовых данных от символьных заключается в том, что над числами кроме операции сравнения производятся разнообразные математические операции: сложение, умножение, извлечение корня, вычисление логарифма и пр. Правила выполнения этих операций в математике подробно разработаны для чисел, представленных в позиционной системе счисления. Основной системой счисления для представления чисел в компьютере является двоичная позиционная система счисления.

Кодирован ие целых и действительных чисел

Целые числа кодируются двоичным кодом достаточно просто -- достаточно взять целое число и делить его пополам до тех пор, пока в остатке не образуется ноль или единица. Совокупность остатков от каждого деления, записанная справа налево вместе с последним остатком, и образует двоичный аналог десятичного числа.

Таким образом, 19 10 = 10011 2 .

Для кодирования целых чисел от 0 до 255 достаточно иметь 8 разрядов двоичного кода (8 бит). Шестнадцать бит позволяют закодировать целые числа от 0 до 65 535, а 24 бита -- уже более 16,5 миллионов разных значений.

Для кодирования действительных чисел используют 80 разрядное кодирование. При этом число предварительно преобразуется в нормализованную форму :

3,1415926 = 0,31415926 * 10 1

300 000 = 0,3 * 10 6

123 456 789 = 0,123456789 * 10 10

Первая часть числа называется мантиссой , а вторая -- характеристикой . Большую часть из 80 бит отводят для хранения мантиссы (вместе со знаком) и некоторое фиксированное количество разрядов отводят для хранения характеристики (тоже со знаком).

1.5 Кодирование графической информации

Важным этапом кодирования графического изображения является разбиение его на дискретные элементы (дискретизация).

При помощи увеличительного стекла можно увидеть, что черно-белое графическое изображение, например из газеты, состоит из мельчайших точек, составляющих определенный узор - растр. Точность передачи рисунка зависит от количества точек и их размера. После разбиения рисунка на точки, начиная с левого угла, двигаясь по строкам слева направо, можно кодировать цвет каждой точки. Далее одну такую точку будем называть пикселем. Пиксель (picture element - элемент рисунка) - минимальная единица изображения, цвет и яркость которой можно задать независимо от остального изображения.

Основными способами представления графики для ее хранения и обработки с помощью компьютера являются растровые и векторные изображения.

Векторное изображение представляет собой графический объект, состоящий из элементарных геометрических фигур (чаще всего отрезков и дуг). Положение этих элементарных отрезков определяется координатами точек и величиной радиуса. Для каждой линии указывается двоичные коды типа линии (сплошная, пунктирная, штрихпунктирная), толщины и цвета.

Растровое изображение представляет собой совокупность точек (пикселей), полученных в результате дискретизации изображения в соответствии с матричным принципом. Объем растрового изображения определяется умножением количества пикселей (на информационный объем одной точки, который зависит от количества возможных цветов. Качество изображения определяется разрешающей способностью монитора. Чем она выше, то есть больше количество строк растра и точек в строке, тем выше качество изображения. В современных ПК в основном используют следующие разрешающие способности экрана: 640 на 480, 800 на 600, 1024 на 768 и 1280 на 1024 точки.

Матричный принцип кодирования графических изображений заключается в том, что изображение разбивается на заданное количество строк и столбцов. Затем каждый элемент полученной сетки кодируется по выбранному правилу.

Качество изображения будет тем выше, чем "плотнее" расположены пиксели, то есть чем больше разрешающая способность устройства, и чем точнее закодирован цвет каждого из них. Для черно-белого изображения код цвета каждого пикселя задается одним битом: 1 - белый, 0 - черный.

Если рисунок цветной, то для каждой точки задается двоичный код ее цвета.

Цветовые модели .

1) Модель HSB характеризуется тремя компонентами: оттенок цвета(Hue), насыщенность цвета (Saturation) и яркость цвета (Brightness). Можно получить большое количество произвольных цветов, регулируя эти компоненты. Эту цветовую модель лучше применять в тех графических редакторах, в которых изображения создают сами, а не обрабатывают уже готовые. Значение цвета выбирается как вектор, выходящий из центра окружности. Направление вектора задается в угловых градусах и определяет цветовой оттенок. Насыщенность цвета определяется длиной вектора, а яркость цвета задается на отдельной оси, нулевая точка которой имеет черный цвет. Точка в центре соответствует белому (нейтральному) цвету, а точки по периметру - чистым цветам.

2) Принцип метода RGB заключается в следующем: известно, что любой цвет можно представить в виде комбинации трех цветов: красного (Red, R), зеленого (Green, G), синего (Blue, B). Другие цвета и их оттенки получаются за счет наличия или отсутствия этих составляющих. Данная цветовая модель является аддитивной, то есть любой цвет можно получить сочетание основных цветов в различных пропорциях. При наложении одного компонента основного цвета на другой яркость суммарного излучения увеличивается. Если совместить все три компоненты, то получим ахроматический серый цвет, при увеличении яркости которого происходит приближение к белому цвету.

3) Принцип метода CMYK . Эта цветовая модель используется при подготовке публикаций к печати. Каждому из основных цветов ставится в соответствие дополнительный цвет (дополняющий основной до белого). Получают дополнительный цвет за счет суммирования пары остальных основных цветов Различают несколько режимов представления цветной графики:

а) полноцветный (True Color);

в) индексный.

При полноцветном режиме для кодирования яркости каждой из составляющих используют по 256 значений (восемь двоичных разрядов), то есть на кодирование цвета одного пикселя (в системе RGB) надо затратить 8*3=24 разряда. Это позволяет однозначно определять 16,5 млн цветов. Это довольно близко к чувствительности человеческого глаза. При кодировании с помощью системы CMYK для представления цветной графики надо иметь 8*4=32 двоичных разряда.

Режим High Color - это кодирование при помощи 16-разрядных двоичных чисел, то есть уменьшается количество двоичных разрядов при кодировании каждой точки. Но при этом значительно уменьшается диапазон кодируемых цветов.

При индексном кодировании цвета можно передать всего лишь 256 цветовых оттенков. Каждый цвет кодируется при помощи восьми бит данных. Но так как 256 значений не передают весь диапазон цветов, доступный человеческому глазу, то подразумевается, что к графическим данным прилагается палитра (справочная таблица), без которой воспроизведение будет неадекватным: море может получиться красным, а листья - синими. Сам код точки растра в данном случае означает не сам по себе цвет, а только его номер (индекс) в палитре. Отсюда и название режима - индексный.

Человеческий глаз воспринимает цветовую информацию в диапазоне волн примерно от 380 нм. (синий цвет) до 770 нм. (красный цвет), причём наименьшую чувствительность имеет в районе 520 нм. (зелёный цвет).

1.6 Кодирование звуковой информации

Мир наполнен самыми разнообразными звуками: тиканье часов и гул моторов, завывание ветра и шелест листьев, пение птиц и голоса людей. О том, как рождаются звуки и что они собой представляют люди начали догадываться очень давно. Еще древнегреческий философ и ученый - энциклопедист Аристотель, исходя из наблюдений, объяснял природу звука, полагая, что звучащее тело создает попеременное сжатие и разрежение воздуха.

Из физики известно, что звук - это колебания воздуха. Если преобразовать звук в электрический сигнал (например, с помощью микрофона), то видно плавно изменяющееся с течением времени напряжение. Для компьютерной обработки такой - аналоговый - сигнал нужно каким-то образом преобразовать в последовательность двоичных чисел.

Делается это, например, так - измеряется напряжение через равные промежутки времени и полученные значения записываются в память компьютера. Этот процесс называется дискретизацией (или оцифровкой), а устройство, выполняющее его - аналого-цифровым преобразователем (АЦП).

Чтобы воспроизвести закодированный таким образом звук, нужно сделать обратное преобразование (для этого служит цифро-аналоговый преобразователь - ЦАП), а затем сгладить получившийся ступенчатый сигнал.

Существует два основных способах записи звука:аналоговый и цифровой . Но для того чтобы записать звук на какой-нибудь носитель его нужно преобразовать в электрический сигнал. Это делается с помощью микрофона. Самые простые микрофоны имеют мембрану, которая колеблется под воздействием звуковых волн. К мембране присоединена катушка, перемещающаяся синхронно с мембраной в магнитном поле. В катушке возникает переменный электрический ток. Изменения напряжения тока точно отражают звуковые волны. Переменный электрический ток, который появляется на выходе микрофона, называется аналоговым сигналом. Применительно к электрическому сигналу «аналоговый» обозначает, что этот сигнал непрерывен по времени и амплитуде. Он точно отражает форму звуковой волны, которая распространяется в воздухе.

Звуковую информацию можно представить в дискретной или аналоговой форме. Их отличие в том, что при дискретном представлении информации физическая величина изменяется скачкообразно («лесенкой»), принимая конечное множество значений. Если же информацию представить в аналоговой форме, то физическая величина может принимать бесконечное количество значений, непрерывно изменяющихся.

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

В начале 80-х годов появились компакт-диски. Они являются примером дискретного хранения звуковой информации, так как звуковая дорожка компакт - диска содержит участки с различной отражающей способностью. Теоретически эти цифровые диски могут служить вечно, если их не царапать, т.е. их преимуществами являются долговечность и неподверженность механическому старению. Другое преимущество заключается в том, что при цифровой перезаписи нет потери качества звука.

На мультимедийных звуковых картах можно найти аналоговые микрофонный предусилитель и микшер.

Цифро-аналоговое и аналого-цифровое преобразование звуковой информации.

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

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

В упрощенном виде принцип работы АЦП заключается в следующем: он измеряет через определенные промежутки времени амплитуду сигнала и передает дальше, уже по цифровому тракту, последовательность чисел, несущих информацию об изменениях амплитуды (см. рисунок 1).

Во время аналого-цифрового преобразования никакого физического преобразования не происходит. С электрического сигнала как бы снимается отпечаток или образец, являющийся цифровой моделью колебаний напряжения в аудиотракте. Если это изобразить в виде схемы, то эта модель представлена в виде последовательности столбиков, каждый из которых соответствует определенному числовому значению. Цифровой сигнал по своей природе дискретен - то есть прерывист, поэтому цифровая модель не совсем точно соответствует форме аналогового сигнала.

Семпл - это промежуток времени между двумя измерениями амплитуды аналогового сигнала. Дословно Sample переводится с английского как «образец». В мультимедийной и профессиональной звуковой терминологии это слово имеет несколько значений. Кроме промежутка времени семплом называют также любую последовательность цифровых данных, которые получили путем аналого-цифрового преобразования. Сам процесс преобразования называютсемплированием . В русском техническом языке называют его дискретизацией.

Вывод цифрового звука происходит при помощи цифро-аналогового преобразователя (ЦАП), который на основании поступающих цифровых данных в соответствующие моменты времени генерирует электрический сигнал необходимой амплитуды.

Параметры семплирования

Важными параметрами семплированияявляются частота и разрядность.

Частота - количество измерений амплитуды аналогового сигнала в секунду.

Если частота семплирования не будет более чем в два раза превышать частоту верхней границы звукового диапазона, то на высоких частотах будут происходить потери. Это объясняет то, что стандартная частота для звукового компакт-диска - это частота 44.1 кГц. Так как диапазон колебаний звуковых волн находится в пределах от 20 Гц до 20 кГц, то количество измерений сигнала в секунду должно быть больше, чем количество колебаний за тот же промежуток времени. Если же частота дискретизации значительно ниже частоты звуковой волны, то амплитуда сигнала успевает несколько раз измениться за время между измерениями, а это приводит к тому, что цифровой отпечаток несет хаотичный набор данных. При цифро-аналоговом преобразовании такой семпл не передает основной сигнал, а только выдает шум.

В новом формате компакт-дисков Audio DVD за одну секунду сигнал измеряется 96 000 раз, т.е. применяют частоту семплирования 96 кГц. Для экономии места на жестком диске в мультимедийных приложениях довольно часто применяют меньшие частоты: 11, 22, 32 кГц. Это приводит к уменьшению слышимого диапазона частот, а, значит, происходит сильное искажение того, что слышно.

Если в виде графика представить один и тот же звук высотой 1 кГц (нота до седьмой октавы фортепиано примерно соответствует этой частоте), но семплированный с разной частотой (нижняя часть синусоиды не показана на всех графиках), то будут видны различия. Одно деление на горизонтальной оси, которая показывает время, соответствует 10 семплам. Можно видеть, что на частоте 11 кГц примерно пять колебаний звуковой волны приходится на каждые 50 семплов, то есть один период синусоиды отображается всего при помощи 10 значений. Это довольно неточная передача. В то же время, если рассматривать частоту оцифровки 44 кГц, то на каждый период синусоиды приходится уже почти 50 семплов. Это позволяет получить сигнал хорошего качества.

Разрядность указывает с какой точностью происходят изменения амплитуды аналогового сигнала. Точность, с которой при оцифровке передается значение амплитуды сигнала в каждый из моментов времени, определяет качество сигнала после цифро-аналогового преобразования. Именно от разрядности зависит достоверность восстановления формы волны.

Для кодирования значения амплитуды используют принцип двоичного кодирования. Звуковой сигнал должен быть представленным в виде последовательности электрических импульсов (двоичных нулей и единиц). Обычно используют 8, 16-битное или 20-битное представление значений амплитуды. При двоичном кодировании непрерывного звукового сигнала его заменяют последовательностью дискретных уровней сигнала. От частоты дискретизации (количества измерений уровня сигнала в единицу времени) зависит качество кодирования. С увеличением частоты дискретизации увеличивается точность двоичного представления информации. При частоте 8 кГц (количество измерений в секунду 8000) качество семплированного звукового сигнала соответствует качеству радиотрансляции, а при частоте 48 кГц (количество измерений в секунду 48000) - качеству звучания аудио- CD.

Если использовать 8-битное кодирование, то можно достичь точность изменения амплитуды аналогового сигнала до 1/256 от динамического диапазона цифрового устройства (28 = 256).

Если использовать 16-битное кодирование для представления значений амплитуды звукового сигнала, то точность измерения возрастет в 256 раз.

В современных преобразователях принято использовать 20-битное кодирование сигнала, что позволяет получать высококачественную оцифровку звука.

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

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

Издавна используется довольно компактный способ представления музыки - нотная запись. В ней специальными символами указывается, какой высоты звук, на каком инструменте и как сыграть. Фактически, ее можно считать алгоритмом для музыканта, записанным на особом формальном языке. В 1983 ведущие производители компьютеров и музыкальных синтезаторов разработали стандарт, определивший такую систему кодов. Он получил название MIDI.

Конечно, такая система кодирования позволяет записать далеко не всякий звук, она годится только для инструментальной музыки. Но есть у нее и неоспоримые преимущества: чрезвычайно компактная запись, естественность для музыканта (практически любой MIDI-редактор позволяет работать с музыкой в виде обычных нот), легкость замены инструментов, изменения темпа и тональности мелодии.

Есть и другие, чисто компьютерные, форматы записи музыки. Среди них - формат MP3, позволяющий с очень большим качеством и степенью сжатия кодировать музыку, при этом вместо 18-20 музыкальных композиций на стандартном компакт-диске (CDROM) помещается около 200. Одна песня занимает, примерно, 3,5 Mb, что позволяет пользователям сети Интернет легко обмениваться музыкальными композициями.

Ухо человека воспринимает звук в диапазоне от 20 Гц до 20 КГц (1 Гц - 1 колебание в секунду).

1.7 Алгоритм Хаффмана

Это алгоритм архивации без потери качества. Представим себе самый общий случай, когда в файле представлена большая часть таблицы ASCII и почти нет однородных последовательностей. В таком случае выгоду можно получить только если разные байты (символы) встречаются в данном файле с различной частотой. Тогда наиболее часто встречающиеся символы могут быть закодированы меньшим числом бит, а те, что встречаются довольно редко наоборот большим числом бит. В итоге результирующий файл с большой вероятностью будет меньшего объема, чем исходный.

Прежде чем описать алгоритм перекодировки, позволяющий наиболее часто встречающиеся символы (байты) кодировать не восемью, а гораздо меньшим числом бит, следует указать на ограничения, свойственные любому, даже самому эффективному алгоритму без потери качества.

Можно представить, что все файлы - это тексты, написанные в алфавите, состоящем из 256 букв (так оно на самом деле и есть). Рассмотрим все множество файлов, размер которых не превышает n byte (где n произвольное число). И допустим, что существует некий алгоритм кодирования, который любой из этих файлов сжимает с "положительной" эффективностью. Тогда множество всех их архивов содержится во множестве всех файлов, размер которых меньше n byte. Согласно нашему предположению существует взаимно-однозначное соответствие между двумя конечными множествами, число элементов в которых не совпадает. Чего быть не может. Отсюда можно сделать довольно значимые выводы: 1) не существует архиватора, который бы одинаково хорошо паковал любые файлы, 2) для любого архиватора найдутся файлы, в результате сжатия которых будут получаться архивы в лучшем случае не меньшего размера, чем исходные файлы.

1.8 Алгоритм кодирования Лемпеля - Зива

Алгоритм Лемпеля -- Зива -- Ве м лча -- это универсальный алгоритм сжатия данных без потерь, созданный Абрахамом Лемпелем, Якобом Зивом и Терри Велчем. Он был опубликован Велчем в 1984 году, в качестве улучшенной реализации алгоритма LZ78 , опубликованного Лемпелем и Зивом в 1978 году. Алгоритм разработан так, чтобы его можно было быстро реализовать, но он не обязательно оптимален, поскольку он не проводит никакого анализа входных данных.

Лемель и Зив используют следующую идею: если в тексте сообщения появляется последовательность из двух ранее уже встречавшихся символов, то эта последовательность объявляется новым символом, для нее назначается код, который при определенных условиях может быть значительно короче исходной последовательности. В дальнейшем в сжатом сообщении вместо исходной последовательности записывается назначенный код. При декодировании повторяются аналогичные действия и потому становятся известными последовательности символов для каждого кода.

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

При кодировании :

1. Выбирается первый символ сообщения и заменяется на его код.

2. Выбираются следующие два символа и заменяются своими кодами. Одновременно этой комбинации двух символов присваивается свой код. Обычно это номер, равный числу уже использованных кодов. Так, если алфавит включает 8 символов, имеющих коды от 000 до 111, то первая двухсимвольная комбинация получит код 1000, следующая - код 1001 и т.д.

3. Выбираются из исходного текста очередные 2, 3,...N символов до тех пор, пока не образуется еще не встречавшаяся комбинация. Тогда этой комбинации присваивается очередной код, и поскольку совокупность А из первых N-1 символов уже встречалась, то она имеет свой код, который и записывается вместо этих N-1 символов. Каждый акт введения нового кода назовем шагом кодирования.

4. Процесс продолжается до исчерпания исходного текста.

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

1.9 Помехоустойчивые коды

Управление правильностью (помехозащищенностью) передачи информации выполняется с помощью помехоустойчивого кодирования. Различают коды, обнаруживающие ошибки, и корректирующие коды, которые дополнительно к обнаружению еще и исправляют ошибки. Помехозащищенность достигается с помощью введения избыточности. Устранение ошибок с помощью корректирующих кодов реализуют в симплексных каналах связи. В дуплексных каналах достаточно применения кодов, обнаруживающи х ошибки так как сигнализация об ошибке вызывает повторную передачу от источника. Это основные методы, используемые в информационных сетях.

Простейшими способами обнаружения ошибок являются контрольное суммирование, проверка на нечетность. Однако они недостаточно надежны, особенно при появлении пачек ошибок. Поэтому в качестве надежных обнаруживающих кодов применяют циклические коды . Примером корректирующего кода является код Хемминга.

В настоящее время темпы развития телекоммуникационных систем стали предпосылкой для появления принципиально новых способов кодирования сообщений. Причем одной из задач кодирования стало не только достоверная передача, но и быстрая обработка данных. Несмотря на рост мощности вычислительной техники, актуальным остается вопрос построения простых алгоритмов коррекции ошибок. Одним из малоизученных направлений в этой области можно считать использование кодов с иррациональным основанием.

Работа подавляющего числа современных систем связи основана на передаче сообщений в цифровом виде. Сбой при приеме любого элемента цифровых данных способен вызвать значительное искажение всего сообщения в целом, что, в свою очередь, может привести к полной потере информации, содержащейся в нем. Высокоэффективным средством решения данной проблемы является применение помехоустойчивого кодирования, основанного на введении искусственной избыточности в передаваемое сообщение. Отметим, что в современных информационных системах важнейшей задачей является обеспечение информационной безопасности, связанной с методами криптографии и кодирования, теоретические основы которой заложил Шеннон в своих трудах.

В 50-е-70-е годы было разработано большое количество алгебраических кодов с исправлением ошибок, среди которых наиболее востребованными стали коды Боуза-Чоудхури-Хоквингема (БЧХ), Рида-Соломона (РС), Рида-Малера, Адамара, Юстенсена, Гоппы, циклические коды, сверточные коды с разными алгоритмами декодирования (последовательное декодирование, алгоритм Витерби), арифметические коды.

Однако на практике применяется относительно небольшая группа алгебраических помехоустойчивых кодов: БЧХ, Рида-Соломона и сверхточные коды. Наиболее широко применяются циклические коды с обнаружением ошибок в стандартных протоколах HDLC, Х.25/2 (LAP-B, LAP-M). Коды Рида-Соломона с исправлением ошибок находят применение в каналах радиосвязи. В каналах спутниковой связи, характеризующихся независимым характером ошибок, широко применяются сверхточные коды.

Следует отметить тот факт, что хотя существующие на данный момент системы передачи данных отвечают всем основным стандартам и требованиям, они все же не являются совершенными. Причин тому влияние помех в канале связи. Одним из средств решения подобных несоответствий в системах передачи цифровой информации, является применение помехоустойчивых кодов, лежащих в основе устройств кодирования/декодирования.

Помехоустойчивое кодирование передаваемой информации позволяет в приемной части системы обнаруживать и исправлять ошибки. Коды, применяемые при помехоустойчивом кодировании, называются корректирующими кодами. Как правило, корректирующий код может исправлять меньше ошибок, чем обнаруживать. Число ошибок, которые корректирующий код может исправить в определенном интервале последовательности двоичных символов, например, в одной кодовой комбинации, называется исправляющей способностью кода.

В разных средах характер помех разный. Ошибки могут быть одиночные, а могут возникать группами, сразу по несколько. В результате помех могут исчезать биты или наоборот -- появляться лишние.

Под помехой понимается любое воздействие, накладывающееся на полезный сигнал и затрудняющее его прием.

1.10 Теоремы Шеннона

Ранее отмечалось, что при передаче сообщений по каналам связи могут возникать помехи, способные привести к искажению принимаемых знаков. Так, например, если вы попытаетесь передать речевое сообщению в ветреную погоду человеку, находящемуся от вас на значительном расстоянии, то оно может быть сильно искажено такой помехой как ветер. Вообще, передача сообщений при наличии помех является серьезной теоретической и практической задачей. Ее значимость возрастает в связи с повсеместным внедрением компьютерных телекоммуникаций, в которых помехи неизбежны.

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

Помехи в передачи информации - свойство отнюдь не только технических систем. Это - вполне обычное дело в быту, например - разговор по телефону, в трубке которого "трещит", вождение автомобиля в тумане и т.д.

Например, каждый фрагмент текста ("предложение") передается трижды, и верным считается та пара фрагментов, которая полностью совпала. Однако, большая избыточность приводит к большим временным затратам при передаче информации и требует большого объема памяти при ее хранении. Отсюда следует задача устранения избыточности, или эффективного кодирования. Впервые теоретическое исследование такого рода проблем предпринял К.Шеннон.

Первая теорема Шеннона о передаче информации, которая называется также основной теоремой о кодировании при отсутствии помех, формулируется следующим образом:

При отсутствии помех передачи всегда возможен такой вариант кодирования сообщения, при котором избыточность кода будет сколь угодно близкой к нулю.

Вторая теорема Шеннона гласит, что при наличии помех в канале всегда можно найти такую систему кодирования, при которой сообщения будут переданы с заданной достоверностью. При наличии ограничения пропускная способность канала должна превышать производительность источника сообщений. Вторая теорема Шеннона устанавливает принципы помехоустойчивого кодирования. Для дискретного канала с помехами теорема утверждает, что, если скорость создания сообщений меньше или равна пропускной способности канала, то существует код, обеспечивающий передачу со сколь угодно малой частотой ошибок.

Эта теорема не дает конкретного метода построения кода, но указывает на пределы достижимого в области помехоустойчивого кодирования, стимулирует поиск новых путей решения этой проблемы.

2 Практическая часть

Программа на кодирование информации

Кодирование информации -- одна из базовых тем курса теоретических основ информатики, отражающая фундаментальную необходимость представления информации в какой-либо форме, -- т.е. кодировании информации. При этом слово «кодирование» понимается не в узком смысле -- кодирование как способ сделать сообщение непонятным для всех, кто не владеет ключом кода, а в широком -- как представление информации в виде сообщения на каком-либо языке.

Освещение данной темы в курсе информатики возможно под различными углами зрения и на различных уровнях. Самый простой подход состоит в рассмотрении понятия кодирования как представления информации в ознакомительном, общеобразовательном плане. Более продвинутый подход включает изучение теории кодирования. В данном практикуме мы ориентируемся на достаточно элементарные сведения о кодировании, имеющие общеобразовательное значение, и оставляем серьезное знакомство с теорией кодирования для школьников.

По данной теме я разработала программу для учащихся 8-9 классов. Программа написана на языке программирования Delphi6 и называется «Кодирование флажковой азбуки».

Суть программы: Вводим сообщение из русских букв, программа выводит закодированное сообщение в виде флажков, по определенному правилу (таблице кодирования): каждой букве присвоен определённый флажок.

На форме нанесены следующие компоненты :

· Компонент Список изображений (ImageList)

Этот компонент расположен на панели Win32. В нём производится работа с графическим изображением, он позволяет хранить наборы картинок фиксированного размера, причём обращаться к картинки (в нашей программе их 34) мы будем по номерам и осуществлять вывод изображений на экран;

· Компонент Область рисования (PaintBox)

Расположен на панели System. Используем для вывода графической информации (флажков).

· Текстовое поле (Edit)

Расположен на панели Standard. Поле, в которое будем вводить сообщение, для того чтобы его закодировать;

· Кнопка (Button)

Расположен на панели Standard. 1 кнопка “очистить” (можно очистить сообщение в текстовом поле и написать новое), 2 кнопка “кодировать” (кодирует сообщение, которое ввели в текстовое поле и выводит уже закодированное сообщение в PaintBox), 3 кнопка “таблица кодирования” (выводит таблицу в новой форме, на которой можно просмотреть, какой букве соответствует флажок);

· Метка (Label)

Расположен на панели Standard.Содержит информацию о том, что сообщение не должно быть более 27 символов;

· Панель (Panel)

На панели будет располагаться PaintBox, нужна для того, чтоб визуально можно было увидеть, куда будет выводиться сообщение.

Приложение

Код кодирования сообщения

procedure TForm1.Button1Click(Sender: TObject);

if Length(s)>27 then

ShowMessage("сообщение более 27 символов");

for i:= 1 to length(s) do

if (s[i]="а") or (s[i]="А") then

if (s[i]="б") or (s[i]="Б") then

if (s[i]="в") or (s[i]="В") then

if (s[i]="г") or (s[i]="Г") then

if (s[i]="д") or (s[i]="Д") then

if (s[i]="е")or (s[i]="Е") then

if (s[i]="ё")or (s[i]="Ё") then

if (s[i]="ж")or (s[i]="Ж") then

if (s[i]="з") or (s[i]="З") then

if (s[i]="и") or (s[i]="И") then

if (s[i]="й") or (s[i]="Й") then

if (s[i]="к") or (s[i]="К") then

if (s[i]="л") or (s[i]="Л") then

if (s[i]="м") or (s[i]="М") then

if (s[i]="н") or (s[i]="Н") then

if (s[i]="о") or (s[i]="О") then

if (s[i]="п") or (s[i]="П") then

if (s[i]="р") or (s[i]="Р") then

if (s[i]="с") or (s[i]="С") then

if (s[i]="т")or (s[i]="Т") then

if (s[i]="у") or (s[i]="У") then

if (s[i]="ф")or (s[i]="Ф") then

if (s[i]="х")or (s[i]="Х") then

if (s[i]="ц")or (s[i]="Ц") then

if (s[i]="ч") or (s[i]="Ч") then

if (s[i]="ш") or (s[i]="Ш") then

if (s[i]="щ")or (s[i]="Щ") then

if (s[i]="ъ")or (s[i]="Ъ") then

if (s[i]="ы")or (s[i]="Ы") then

if (s[i]="ь") or (s[i]="Ь") then

if (s[i]="э") or (s[i]="Э") then

if (s[i]="ю") or (s[i]="Ю") then

if (s[i]="я") or (s[i]="Я") then

if s[i]=" " then

ImageList1.Draw(PaintBox1.Canvas,35*i,5,k,true);

Очистка сообщения .

procedure TForm1.Button3Click(Sender: TObject);

Посмотреть таблицу кодирования .

procedure TForm1.Button2Click(Sender: TObject);

Заключение

За недолгое время компьютер из вычислительного устройства превратился в устройство для обработки многих видов информации: текстовой, графической, звуковой. С помощью компьютера информация упаковывается и шифруется, путешествует по различным каналам связи и может быть доставлена в любой уголок мира. Современный человек уже не представляет свою деятельность без применения компьютера. Как информация может быть представлена в компьютере, как она передается по каналам связи - ответы на все эти вопросы мы получаем после изучения темы "Кодирование информации". Сведения об информации, языках как способах представления информации, о кодировании информации без компьютера, о двоичном кодировании, о системах счисления, о кодировании информации в компьютере - все эти вопросы должны входить в содержание Федерального компонента образовательного стандарта школьного курса информатики.

Список использованных источников

1. Delphi 7. Учебный курс / С. И. Бобровский. - СПб.: Питер, 2003.

2. Задачник-практикум по информатике: Учеб. Пособие для сред. Шк. / Пол ред. И. Семакина, Е. Хеннера. М.: Лаборатория базовых знаний, 1999.

3. Информатика: Базовый курс для 7 - 9 кл. / И. Г. Семакин, Л.А. Залогова, С. В. Русаков, Л. В. Шестакова - М.: Лаборатория базовых знаний, 1998.

4. Информатика. 7 - 9 кл. Базовый курс. Учебник. / Под. ред. Проф. Н. В. Макаровой. - Спб.: Питер, 2002.

5. Информатика: Учеб.пособие для студ. Пед. Вузов / А. В. Могилёв, Н. И. Пак, Е. К. Хеннер; Под ред. Е. К. Хеннера. - 2-е издание, стер. - М.: Издательский центр «Академия».

6. Кушниренко А. Г., Лебедев Г. В., Сворень Р. А. Основы информатики и вычислительной техники: Учеб. Для 10 - 11 кл. сред. шк., - М.: Просвещение, 1996.

7. Основы теории информации и кодирования. Учебник / В.В. Крушный - М.,2005.

8. Трофимова М.В. Измерение количества информации // Информатика: Еженед. прил. к газ. «Первое сентября». №2. 2000.

9. Теория кодирования и теория информации. Учебник / Р. В.Хемминг - М.: Издат.: Радио и Связь, 1985.

10. URL: //sdo.uspi.ru/mathem&inform/lek8/lek_8.htm

11. URL: ru.wikipedia.org/wiki/Lempel-Ziv-Welch

Размещено на Allbest.ru

...

Подобные документы

    Представление информации в двоичной системе. Необходимость кодирования в программировании. Кодирование графической информации, чисел, текста, звука. Разница между кодированием и шифрованием. Двоичное кодирование символьной (текстовой) информации.

    реферат , добавлен 27.03.2010

    Представление числовой информации с помощью систем счисления. Кодирование символьной, текстовой, числовой и графической информации. Устройство жесткого диска; дисковод компакт-дисков CD-ROM. Использование главного меню Windows; языки программирования.

    контрольная работа , добавлен 16.03.2015

    Знакомство с идеей векторного способа представления изображений в цифровом виде. Разработка последовательности команд для кодирования графического объекта. Основные команды; двоичное кодирование графической информации, растровый и векторный варианты.

    презентация , добавлен 05.01.2012

    Технология обработки графической информации с помощью ПК, применение в научных и военных исследованиях: формы, кодирование информации, ее пространственная дискретизация. Создание и хранение графических объектов, средства обработки векторной графики.

    реферат , добавлен 28.11.2010

    Кодирование как процесс представления информации в виде кода. Кодирование звуковой и видеоинформации, характеристика процесса формирования определенного представления информации. Особенности универсального дружественного интерфейса для пользователей.

    контрольная работа , добавлен 22.04.2011

    Информация и информационные процессы в природе, обществе, технике. Информационная деятельность человека. Кодирование информации. Способы кодирования. Кодирование изображений. Информация в кибернетике. Свойства информации. Измерение количества информации.

    реферат , добавлен 18.11.2008

    Место темы "Кодирование информации" в школьном курсе информатики. Рекомендации по изучению "Кодирования информации" в школьном курсе информатики. Дидактический материал для изучения темы "Кодирование информации" и внеклассное мероприятие по информатике.

    курсовая работа , добавлен 17.06.2012

    Кодирование символьной и числовой информации. Основные системы счисления. Двоичная система счисления. Устройства вывода информации. Правила выполнения арифметических операций. Логические основы построения, функциональные узлы ЭВМ. Синтез логических схем.

    презентация , добавлен 08.11.2016

    Методы арифметического кодирования. Основные функции программ, реализующие алгоритмы кодирования по методам Хаффмана, Голомба, Фибоначчи и Элиаса. Разработка программно-аппаратных средств оптимального арифметического кодирования и их экономический расчет.

    дипломная работа , добавлен 26.05.2012

    Понятие информации и основные принципы ее кодирования, используемые методы и приемы, инструментарий и задачи. Специфические особенности процессов кодирования цифровой и текстовой, графической и звуковой информации. Логические основы работы компьютера.