• Веб-дизайн и поисковая оптимизация. Бухарбаева Н.А. Кодирование текстовой информации

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

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

    1.1. Канал связи

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

    Рис. 1.1. Блок-схема общей системы передачи или хранения информации.

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

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

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

    Рис. 1.2, Блок-схема типичной системы передачи или хранения информации.

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

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

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

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

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

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

    Неправильная кодировка HTML страниц

    Создадим тестовый файлик:

    Sudo gedit /var/www/html/encoding.html

    Скопируем в него:

    Проверка кодировки

    Откроем этот файл в браузере

    Как можно видеть, кодировка браузером определена неправильно:

    Имеется несколько способов исправить эту ситуацию. Начнём с самого простого - явно указать кодировку для веб-страницы. Это делается метатегом, который должен быть расположен внутри тэга head :

    Добавим эту строку к нашему тестовому файлику, чтобы получилось так:

    Проверка кодировки

    Тестовый файл для проверки кодировки

    Как мы можем убедиться на следующем скриншоте, проблема решена:

    Если кодировка вашего файла отличается от UTF-8 , то вместо неё поставьте windows-1251 или ту, которая соответствует кодировке веб-страницы. Чтобы научиться определять кодировку файлов, посмотрите .

    Это был самый простой способ исправления проблемы с кодировкой - без изменения настроек сервера.

    Вернём наш тестовый файл в исходное состояние и продолжим изучение способов указания кодировки.

    Если файлы .htaccess включены настройками Apache, то эти файлы можно использовать чтобы указывать кодировку отправляемых веб-сервером страниц. Чтобы включить поддержку файлов .htaccess в конфигурационном файле Apache (/etc/apache2/apache2.conf ) найдите группу строк

    Options Indexes FollowSymLinks AllowOverride None Require all granted

    И в ней замените

    AllowOverride None

    AllowOverride All

    После этого сервер нужно перезапустить.

    Sudo systemctl restart apache2.service

    Файл .htaccess должен быть размещён в той же директории, что и сайт. Мой сайт размещён в корневой директории веб-сервера. Если у вас также, то теперь в папке /var/www/html/ создайте файл .htaccess и добавьте в него директиву AddDefaultCharset после которой укажите желаемую кодировку. Примеры

    AddDefaultCharset UTF-8

    AddDefaultCharset windows-1251

    Можно указать кодировку, которая будет применена только к файлам определённого формата:

    AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

    Набор файлов может быть любым, например:

    AddCharset utf-8 .html .css .php .txt .js

    Следующий вариант является альтернативным и также позволяет устанавливать кодировку для файлов определённого типа, для него нужно, чтобы был включён mod_headers :

    Header set Content-Type "text/html; charset=utf-8"

    Ещё один вариант, который также можно использовать в файле .htaccess для установки кодировки UTF-8:

    IndexOptions +Charset=UTF-8

    Если сайт на PHP, то дополнительно может понадобиться продублировать кодировку с php_value default_charset :

    AddDefaultCharset windows-1251 php_value default_charset "cp1251"

    Можно вместо создания файла.htaccess установить кодировку в конфигурационном файле веб-сервера. Для Apache CentOS/Fedora это файл httpd.conf, а на Debian/Ubuntu это файл apache2.conf. Добавьте следующую строку для установки кодировки и перезапустите веб-сервер, чтобы изменения вступили в силу:

    AddDefaultCharset UTF-8

    Как установить UTF-8 кодировку в PHP

    В PHP скрипте для установки кодировки используется header , например:

    Header("Content-Type: charset=utf-8");

    Обычно вместе с кодировкой также указывают тип содержимого (в примере вариант для HTML страницы):

    Header("Content-Type: text/html; charset=utf-8");

    Ещё один вариант для RSS ленты:

    Header("Content-type: text/xml; charset=utf-8");

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

    Описанный способ работает только когда PHP скрипт полностью генерирует содержимое страницы. Статические страницы (такие как html) вы должны сохранять в кодировке utf-8. Большинство веб серверов обратят внимание на кодировку файла и добавят соответствующий заголовок. На самом деле, сохранение PHP файла в кодировке utf-8 приведёт к такому же результату.

    Неправильная кодировка результатов из базы данных MySQL

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

    Нужно начать с определения кодировки ваших таблиц. Можно посмотреть в phpMyAdmin :

    Обратите внимание на столбец «Сравнение », запись «utf8_unicode_ci » означает, что используется кодировка UTF-8 .

    Можно подключиться к СУБД MySQL и проверить кодировку таблиц без phpMyAdmin. Для этого:

    Mysql -u root -p

    Если вы забыли имя базы данных, то выполните команду:

    SHOW DATABASES;

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

    USE information_schema;

    Если вы забыли имя таблиц, выполните:

    SHOW FULL COLUMNS FROM имя_таблицы;

    Например:

    SHOW FULL COLUMNS FROM GLOBAL_STATUS;

    Вы увидите примерно следующее:

    Смотрите столбец Collation . В моём случае там utf8_general_ci , это, как и utf8_unicode_ci , кодировка UTF-8 . Кстати, если вы не знаете в чём разница между кодировками utf8_general_ci , utf8_unicode_ci , utf8mb4_general_ci , utf8mb4_unicode_ci , а также какую кодировку выбрать для базы данных MySQL, то посмотрите .

    Теперь, когда мы узнали кодировку (в моём случае это UTF-8), то при каждом подключении к СУБД MySQL нужно выполнять последовательно запросы:

    SET NAMES UTF8 SET CHARACTER SET UTF8 SET character_set_client = UTF8 SET character_set_connection = UTF8 SET character_set_results = UTF8

    В PHP это можно сделать примерно так:

    $this->mysqli = new mysqli($server, $username, $password, $basename); if ($this->mysqli->connect_error) { $this->errorHandler_c->logError(1, "Connect Error (" . $this->mysqli->connect_errno . ") " . $this->mysqli->connect_error, $_SERVER ["REQUEST_URI"]); } $this->mysqli->query("SET NAMES UTF8"); $this->mysqli->query("SET CHARACTER SET UTF8"); $this->mysqli->query("SET character_set_client = UTF8"); $this->mysqli->query("SET character_set_connection = UTF8"); $this->mysqli->query("SET character_set_results = UTF8");

    Обратите внимание, что UTF8 вам нужно заменить на ту кодировку, которая используется для ваших таблиц.

    Изменение кодировки файлов

    Если вы решили пойти другим путём и вместо установки новой кодировки изменить кодировку ваших файлов, то посмотрите статью « ». В ней рассказано, как узнать текущую кодировку файлов и как конвертировать файлы в любую кодировку (не только UTF-8).

    Как узнать, какую кодировку отправляет сервер

    Если вы хотите узнать, какие настройки кодировки имеет веб-сервер (какую кодировку передаёт в заголовках), то воспользуйтесь следующей командой:

    Curl URL -s -o /dev/null -D /dev/stdout | grep -E "charset"

    В ней вместо URL вставьте реальный адрес проверяемого сайта. Если сайт использует HTTPS, то укажите адрес сайта вместе с протоколом, например

    Curl https://softocracy.ru -s -o /dev/null -D /dev/stdout | grep -E "charset"

    Какую кодировку выбрать для веб-сайта

    Сожержание

    I. История кодирования информации………………………………..3

    II. Кодирование информации…………………………………………4

    III. Кодирование текстовой информации…………………………….4

    IV. Виды таблиц кодировок…………………………………………...6

    V. Расчет количества текстовой информации………………………14

    Список используемой литературы…………………………………..16

    I . История кодирования информации

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

      криптография – это тайнопись, система изменения письма с целью сделать текст непонятным для непосвященных лиц;

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

    Один из самых первых известных методов шифрования носит имя римского императора Юлия Цезаря (I век до н.э.) . Этот метод основан на замене каждой буквы шифруемого текста, на другую, путем смещения в алфавите от исходной буквы на фиксированное количество символов, причем алфавит читается по кругу, то есть после буквы я рассматривается а. Так слово «байт» при смещении на два символа вправо кодируется словом «гвлф». Обратный процесс расшифровки данного слова – необходимо заменять каждую зашифрованную букву, на вторую слева от неё.

    II. Кодирование информации

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

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

    Обычно каждый образ при кодировании (иногда говорят – шифровке) представлении отдельным знаком.

    Знак - это элемент конечного множества отличных друг от друга элементов.

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

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

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

    III. Кодирование текстовой информации

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

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

    Начиная с конца 60-х годов, компьютеры все больше стали использоваться для обработки текстовой информации, и в настоящее время основная доля персональных компьютеров в мире (и большая часть времени) занята обработкой именно текстовой информации. Все эти виды информации в компьютере представлены в двоичном коде, т. е. используется алфавит мощностью два (всего два символа 0 и 1). Связано это с тем, что удобно представлять информацию в виде последовательности электрических импульсов: импульс отсутствует (0), импульс есть (1).

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

    С точки зрения ЭВМ текст состоит из отдельных символов. К числу символов принадлежат не только буквы (заглавные или строчные, латинские или русские), но и цифры, знаки препинания, спецсимволы типа "=", "(", "&" и т.п. и даже (обратите особое внимание!) пробелы между словами.

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

    Традиционно для кодирования одного символа используется количество информации, равное 1 байту, т. е. I = 1 байт = 8 бит. При помощи формулы, которая связывает между собой количество возможных событий К и количество информации I, можно вычислить сколько различных символов можно закодировать (считая, что символы - это возможные события): К = 2 I = 2 8 = 256, т. е. для представления текстовой информации можно использовать алфавит мощностью 256 символов.

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

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

    Удобство побайтового кодирования символов очевидно, поскольку байт - наименьшая адресуемая часть памяти и, следовательно, процессор может обратиться к каждому символу отдельно, выполняя обработку текста. С другой стороны, 256 символов – это вполне достаточное количество для представления самой разнообразной символьной информации.

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

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

    Все символы компьютерного алфавита пронумерованы от 0 до 255. Каждому номеру соответствует восьмиразрядный двоичный код от 00000000 до 11111111. Этот код просто порядковый номер символа в двоичной системе счисления.

    IV . Виды таблиц кодировок

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

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

    В качестве международного стандарта принята кодовая таблица ASCII (American Standard Code for Information Interchange - Американский стандартный код для информационного обмена), кодирующая первую половину символов с числовыми кодами от 0 до 127 (коды от 0 до 32 отведены не символам, а функциональным клавишам).

    Таблица кодов ASCII делится на две части.

    Международным стандартом является лишь первая половина таблицы, т.е. символы с номерами от 0 (00000000), до 127 (01111111).

    Структура таблицы кодировки ASCII

    Порядковый номер

    Символ

    00000000 - 00011111

    Символы с номерами от 0 до 31 принято называть управляющими.

    Их функция – управление процессом вывода текста на экран или печать, подача звукового сигнала, разметка текста и т.п.

    0100000 - 01111111

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

    Символ 32 - пробел, т.е. пустая позиция в тексте.

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

    10000000 - 11111111

    Альтернативная часть таблицы (русская).

    Вторая половина кодовой таблицы ASCII, называемая кодовой страницей (128 кодов, начиная с 10000000 и кончая 11111111), может иметь различные варианты, каждый вариант имеет свой номер.

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


    Первая половина таблицы кодов ASCII

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

    Для букв русского алфавита также соблюдается принцип последовательного кодирования.

    Вторая половина таблицы кодов ASCII

    К сожалению, в настоящее время существуют пять различных кодировок кириллицы (КОИ8-Р, Windows. MS-DOS, Macintosh и ISO). Из-за этого часто возникают проблемы с переносом русского текста с одного компьютера на другой, из одной программной системы в другую.

    Хронологически одним из первых стандартов кодирования русских букв на компьютерах был КОИ8 ("Код обмена информацией, 8-битный"). Эта кодировка применялась еще в 70-ые годы на компьютерах серии ЕС ЭВМ, а с середины 80-х стала использоваться в первых русифицированных версиях операционной системы UNIX.

    От начала 90-х годов, времени господства операционной системы MS DOS, остается кодировка CP866 ("CP" означает "Code Page", "кодовая страница").

    Компьютеры фирмы Apple, работающие под управлением операционной системы Mac OS, используют свою собственную кодировку Mac.

    Кроме того, Международная организация по стандартизации (International Standards Organization, ISO) утвердила в качестве стандарта для русского языка еще одну кодировку под названием ISO 8859-5.

    Наиболее распространенной в настоящее время является кодировка Microsoft Windows, обозначаемая сокращением CP1251. Введена компанией Microsoft; с учетом широкого распространения операционных систем (ОС) и других программных продуктов этой компании в Российской Федерации она нашла широкое распространение.

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

    Это 16-разрядная кодировка, т.е. в ней на каждый символ отводится 2 байта памяти. Конечно, при этом объем занимаемой памяти увеличивается в 2 раза. Но зато такая кодовая таблица допускает включение до 65536 символов. Полная спецификация стандарта Unicode включает в себя все существующие, вымершие и искусственно созданные алфавиты мира, а также множество математических, музыкальных, химических и прочих символов.

    Внутреннее представление слов в памяти компьютера

    с помощью таблицы ASCII

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


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

    Например, последовательность числовых кодов 221, 194, 204 в кодировке СР1251 образует слово «ЭВМ», тогда как в других кодировках это будет бессмысленный набор символов.

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

    V . Расчет количества текстовой информации

    Задача 1: Закодируйте слово “Рим” с помощью таблиц кодировок КОИ8-Р и CP1251.

    Решение:

    Задача 2: Считая, что каждый символ кодируется одним байтом, оцените информационный объем следующего предложения:

    “Мой дядя самых честных правил,

    Когда не в шутку занемог,

    Он уважать себя заставил

    И лучше выдумать не мог.”

    Решение: В данной фразе 108 символов, учитывая знаки препинания, кавычки и пробелы. Умножаем это количество на 8 бит. Получаем 108*8=864 бита.

    Задача 3: Два текста содержат одинаковое количество символов. Первый текст записан на русском языке, а второй на языке племени нагури, алфавит которого состоит из 16 символов. Чей текст несет большее количество информации?

    Решение:

    1) I = К * а (информационный объем текста равен произведению числа символов на информационный вес одного символа).

    2) Т.к. оба текста имеют одинаковое число символов (К), то разница зависит от информативности одного символа алфавита (а).

    3) 2 а1 = 32, т.е. а 1 = 5 бит, 2 а2 = 16, т.е. а 2 = 4 бит.

    4) I 1 = К * 5 бит, I 2 = К * 4 бит.

    5) Значит, текст, записанный на русском языке в 5/4 раза несет больше информации.

    Задача 4: Объем сообщения, содержащего 2048 символов, составил 1/512 часть Мбайта. Определить мощность алфавита.

    Решение:

    1) I = 1/512 * 1024 * 1024 * 8 = 16384 бит – перевели в биты информационный объем сообщения.

    2) а = I / К = 16384 /1024 =16 бит – приходится на один символ алфавита.

    3) 2*16*2048 = 65536 символов – мощность использованного алфавита.

    Задача 5: Лазерный принтер Canon LBP печатает со скоростью в среднем 6,3 Кбит в секунду. Сколько времени понадобится для распечатки 8-ми страничного документа, если известно, что на одной странице в среднем по 45 строк, в строке 70 символов (1 символ – 1 байт)?

    Решение:

    1) Находим количество информации, содержащейся на 1 странице: 45 * 70 * 8 бит = 25200 бит

    2) Находим количество информации на 8 страницах: 25200 * 8 = 201600 бит

    3) Приводим к единым единицам измерения. Для этого Мбиты переводим в биты: 6,3*1024=6451,2 бит/сек.

    4) Находим время печати: 201600: 6451,2 =31 секунда.

    Список используемой литературы

      Агеев В.М. Теория информации и кодирования: дискретизация и кодирование измерительной информации. - М.: МАИ, 1977.

      Кузьмин И.В., Кедрус В.А. Основы теории информации и кодирования. - Киев, Вища школа, 1986.

      Простейшие методы шифрования текста/ Д.М. Златопольский. – М.: Чистые пруды, 2007 – 32 с.

      Угринович Н.Д. Информатика и информационные технологии. Учебник для 10-11 классов / Н.Д.Угринович. – М.: БИНОМ. Лаборатория знаний, 2003. – 512 с.

      http://school497.spb.edu.ru/uchint002/les10/les.html#n

    Если последовательность бит не выглядит разумной(с точки зрения человека), то это случай, когда документ скорее всего был неверно сконвертирован в определенный момент. К примеру мы берем текст ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ, и, не придумав ничего лучше, сохраняем его в UTF-8. Текстовый редактор предположил, что он правильно прочитал текст с кодировкой Mac Roman и теперь его надо сохранить в другой кодировке. В конце концов, все эти символы валидны в Unicode. В смысле, в Unicode есть пункт для É, для G, и так далее. Так что мы просто сохраняем его в UTF-8:

    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

    Вот так теперь текст ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ представляется последовательностью бит UTF-8. Эта битовая последовательность совершенно оторвана от того, что было в изначальном документе. В какой бы кодировке мы не открывали эту последовательность, нам ни за что не видать исходный текст エンコーディングは難しくない. Он просто потерян. Его можно было бы восстановить, знай мы изначальную кодировку Shift-JIS и то, что мы расценили текст как Mac Roman, а затем сохранили его в UTF-8. Но такие чудеса редко встречаются.

    Множество раз конкретная битовая последовательность оказывается неверной в конкретной кодировке. Если бы мы попытались открыть изначальный документ в ASCII, то увидели бы, что часть символов распозналась, а часть – нет. Программа, который вы пользуетесь, могла бы решить просто выбросить байты, которые не подходят под текущую кодировку, или заменить их на знаки вопроса. Или на специальный символ замены в Unicode: � (U+ FFFD). Если после процедуры изъятия неподходящих символов вы сохраните документ, то потеряете их навсегда.

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

    И как же правильно менять кодировки?

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

    Если нужно перегнать текст из одной кодировки в другую, применяйте специальные инструменты. Конвертация – утомительный труд по сравнению двух кодовых страниц и решению, что символ 152 в кодировке А совпадает с символом 4122 в кодировке B с последующим изменением битов. Не нужно изобретать этот велосипед: в каждом распространенном языке программирования есть абстрактные от битов и кодовых страниц инструменты для конвертации текста из кодировки в кодировку.

    Скажем, ваше приложение должно принимать файлы в GB18030, но внутри вы работает в UTF-32. Инструмент iconv может в одну строку сделать конвертацию: iconv("GB18030", "UTF-32", $string). Символы останутся неизменным, несмотря на то, что битовое представление измененилось.

    character GB18030 encoding UTF-32 encoding
    縧 10111111 01101100 00000000 00000000 01111110 00100111

    Вот и все. Содержание строки в его человеческом понимании не изменилось, но теперь это правильная строка в UTF-32. Если вы продолжите работать с ней в UTF-32, у вас не будет никаких проблем с нечитаемыми символами. Однако, как мы обсуждали ранее, не все кодировки способны отображать все символы. Невозможно закодировать символ 縧 в любой из кодировок для европейских языков. И может случится нечто ужасное.

    Все в Unicode

    Именно поэтому не существует оправдания в 21 веке не использовать Unicode. Некоторые специализированные кодировки для европейских языков могут более производительны, чем Unicode для конкретных языков. Но пока вам не приходится работать с терабайтами специального текста(а это ОЧЕНЬ много), вам не о чем беспокоиться. Проблемы, вытекающие из-за несовместимости кодировок, гораздо страшнее, чем потерянный гигабайт. И этот аргумент станет только весомей с ростом и удешевлением хранения данных и ширины канала.

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

    Счастливые случайности
    У меня был сайт подключенный к БД. Мое приложение обрабатывала все как UTF-8 и в БД хранила его так, и все было супер, но когда я зашел в админку БД, я ничего не мог понять.
    - анонимный быдлокодер

    Возникают ситуации, когда кодировки обрабатываются неверно, но все по прежнему работает нормально. Часто бывает, что кодировка базы данных выставлена в latin-1, а приложение работает с UTF-8(или любой другой). Вобщем-то, любая комбинация 1 и 0 допустима в однобайтной latin-1. Если база данных получает от приложения данные вида 11100111 10111000 10100111, то оно с радостью сохраняет их, думая, что приложение имело ввиду 縧. Почему бы и нет? Позже бд возвращает те же самые биты приложению, которое счастливо, ведь получило символ UTF-8 縧, который и задумывался. Но интерфейс администрирования бд знает, что используется latin-1, и вот результат: ничего не возможно понять.
    Глупец просто выиграл лотерею, хотя звезды были не на его стороне. Любая операция над текстом в бд может сработать, но может и выполниться не как задумано, так как бд неправильно воспринимает текст. В худшем случае, бд ненароком уничтожит весь текст, выполняя произвольную операцию 2 года спустя после установки из-за неверной кодировки(и конечно, никакого тебе бэкапа).

    UTF-8 и ASCII

    Гениальность UTF-8 в бинарной совместимости с ASCII, которая является де-факто основой для всех кодировок. Все символы ASCII занимают максимум байт в UTF-8 и используют те же биты, что и в ASCII. Иными словами, ASCII может быть отражено 1:1 в UTF-8. Любой символ не из ASCII занимает 2 или более байт в UTF-8. Большинство языков программирования, использующих ASCII в качестве кодировки исходного кода, позволяет включать текст в UTF-8 прямо в текст:

    Сохранение в UTF-8 даст последовательность:

    00100100 01110011 01110100 01110010 01101001 01101110 01100111 00100000
    00111101 00100000 00100010 11100110 10111100 10100010 11100101 10101101
    10010111 00100010 00111011

    Только 12 байт из 17(те, что начинаются с 1) являются символами UTF-8(2 символа по 3 байта). Прочие символы находятся в ASCII. Парсер прочитает следующее:

    $string = «11100110 10111100 10100010 11100101 10101101 10010111»;

    Парсер воспринимает все за кавычкой как последовательность бит, которую нужно трактовать как есть, все, вплоть до другой кавычки. Если вы просто выведете эту последовательность, вы выведете текст в UTF-8. Не нужно делать ничего больше. Парсеру не нужно специально поддерживать utf-8, нужно просто воспринимать строки буквально. Простые парсеры могут поддерживать Unicode именно так, на самом деле не поддерживая Unicode. Однако многие языки программирования явно поддерживают Unicode.

    Кодировки и PHP.

    PHP не поддерживает Unicode. Правда, он поддерживает его достаточно хорошо. Предыдущий параграф показывает, как включать символы UTF-8 прямо в текст программы без каких-либо проблем, ибо UTF-8 обратно совместима с ASCII, и это все, что нужно PHP. Однако утверждение, что «PHP не поддерживает Unicode» истинно, ибо вызывает множество затруднений в сообществе PHP.

    Ложные обещания

    Одной моей мозолью стали функции utf8_encode и utf8_decode. Я часто вижу глупости наподобии «Чтобы использовать Unicode в PHP, нужно вызвать utf8_encode для вводимого текста и utf8_decode для выводимого». Эти две функции обещают некую автоматическую конвертацию текста UTF-8, которая якобы обязательна, ибо «PHP не поддерживает Unicode». Если вы читаете эту статью не по диагонали, то знаете, что

    1. Ничего специфического нет в UTF-8
    2. Вы не можете закодировать текст в UTF-8 постфактум

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

    Текст либо закодирован в UTF-8, либо не закодирован. Если нет, то он закодирован в ASCII, ISO-8859-1, UTF-16 или как-нибудь еще. Если он не в UTF-8, но предполагается, что он содержит «UTF-8 символы», то у вас когнитивный диссонанс. Если текст все же содержит нужные символы, закодированные в UTF-8, то он в UTF-8.

    Так что же, черт возьми, делает utf8_encode?

    «Переводит строку ISO-8859-1 в кодировку UTF-8»

    Ага! Автор хотел сказать, что функция конвертирует текст из ISO-8859-1 в UTF-8. Вот она для чего. Такое ужасное название ей наверно дал какой-нибудь непредусмотрительный европеец. Тоже самое касается и utf8_decode. Эти функции неприменимы ни для чего, кроме конвертации из ISO-8859-1 в UTF-8. Если вам нужна другая пара кодировок, используйте iconv.
    utf8_encode – это вам не волшебная палочка, которой нужно махать над каждым словом потому что «PHP не поддерживает Unicode». Она вызывает больше проблем, чем решает – скажите спасибо тому европейцу и невежам-программистам.

    Нативный-шмативный

    Так что имеют ввиду, когда говорят, что язык поддерживает Unicode? Важно, предполагает ли язык, что один символ занимает один байт, или нет. Так, PHP позволяет получить доступ до выбранного символа, трактуя строку как символьный массив:

    Если $string имеет однобайтную кодировку, то она отдаст нам первый символ. Но только потому, что «character» совпадает с «byte» в однобайтной кодировке. PHP просто отдает первый байт без единой мысли о символах. Строки для PHP – не более, чем последовательности байт, ни больше, ни меньше. Эти ваши «читаемые символы» - не более, чем выдумка человека, PHP на них наплевать.

    01000100 01101111 01101110 00100111 01110100
    D o n " t
    01100011 01100001 01110010 01100101 00100001
    c a r e !

    Тоже касается и многих стандартных функций, таких как substr, strpos, trim и прочих. Поддержка прекращается там, где кончается соответствие между байтом и символом:

    11100110 10111100 10100010 11100101 10101101 10010111
    漢 字

    $string для указанной строки отдаст опять же только первый байт, равный 11100110. Другими словами, третий байт символа 漢. Последовательность 11100110 неверна для UTF-8, так что строка теперь тоже неверна. Если вам тоже так кажется, можете попробовать другую кодировку, в которой 11100110 будет каким-нибудь допустимым случайным символом. Можете веселиться, только не на боевом сервере.

    Вот и все. «PHP не поддерживает Unicode» означает, что большинство функций в языке предполагают, что один байт равен одному символу, что ведет к обрезке многобайтных символов или неверному подсчету длины строки. Это не означает, что вы не можете использовать Unicode в PHP, или что любой текст надо прогонять через utf8_encode, или еще какую-нибудь глупость.

    К счастью, существует специальное расширение, которое добавляет все важные строковые функции, но с поддержкой многобайтных кодировок. mb_substr($string, 0, 1, ‘UTF-8’) на вышеупомянутой строке совершенно правильно вернет последовательность 11100110 10111100 10100010, соответствующую символу 漢. Из-за того, что функции нужно думать о том, что она делает, ей нужно передать кодировку. Поэтому эти функции принимают параметр $encoding. К слову, кодировку можно задать глобально для всех функции mb_ с помощью mb_internal_encoding.

    Употребление и злоупотребление обработкой ошибок PHP

    Вся проблема (не-)поддержки Unicode в PHP в том, что интерпретатору плевать. Последовательности байт, ха. Нет дела до того, что они значат. Не делается ничего, кроме хранения строк в памяти. У PHP даже понятия такого нет – кодировка. И пока не нужно манипулировать строками, это и не важно. Делается работа с последовательностями байт, которые могут быть всопринятыми кем-то как символы. PHP требует от вас только сохранять исходный код в чем-нибудь, совместимом с ASCII. Парсер PHP ищет конкретные символы, которые говорят ему что делать. 00100100 говорит: «объяви переменную», 00111101 – «присвой», 00100010 – начало или конец строки и т.д. Все, что не важно парсеру, воспринимаются как литералы байтовых последовательностей. Это касается и всего, что заключено в кавычки. Это значит:

    1. Вам не удастся сохранить исходник с PHP в несовместимую с ASCII кодировку. Например в UTF-16 знак кавычик кодируется как 00000000 00100010. Для PHP, который все воспринимает как ASCII, это NUL-байт, за которым следует кавычка. PHP наверно бы икал на каждый символ оказывался бы NUL.
    2. Вы можете сохранить PHP в совместимую с ASCII кодировку. Если первые 128 пунктов кодировки совпадают с ASCII, PHP съест их. Все значимые символы для PHP лежат в пределах первых 128 пунктов, определенных ASCII. Если строковые литералы содержат что-то выходящие за этот предел, PHP не обратит внимание. Вы может сохранить исходник в ISO-8859-1, Mac Roman, UTF-8 или любую другую кодировку. Строковые литеры в вашем коде получат ту кодировку, в которой вы сохраняете файл.
    3. Любой внешний файл для PHP может иметь произвольную кодировку. Если парсеру не надо обрабатывать файл, то он останется довольным.
      $foo = file_get_contents("bar.txt");

      Написанное выше просто засунет байты из bar.txt в переменную $foo. PHP не будет пытаться ничего интерпретировать, кодировать или совершать другие махинации с содержимым. Файл может содержать бинарные данные или картинку, PHP все равно.

    4. Если внешняя и внутрення кодировки должны совпадать, то они действительно должны. Обыденным случаем является локализация: в коде вы пишете что-то типа echo localize(‘Foobar’), а во внешем файле это:
      msgid «Foobar»
      msgstr "フーバー"

      Обе строки Foobar должны иметь идентичное битовое представление. Если исходный код в ASCII, а локализционный – в UTF-16, вам не повезло. Нужно проводить дополнительную конвертацию.

    Проницательный читатель может спросить, скажем, можно ли сохранить последовательно байт UTF-16 в литерал исходного файла в ASCII, и ответ будет всегда такой: конечно.

    01100101 01100011 01101000 01101111 00100000 00100010
    e c h o "
    11111110 11111111 00000000 01010101 00000000 01010100
    (UTF-16 marker) U T
    00000000 01000110 00000000 00101101 00000000 00110001
    F - 1
    00000000 00110110 00100010 00111011
    6 " ;

    Первая строка и последние 2 байта – из ASCII. Остальное представлено в UTF-16 2 байтами на символ. Ведущие 11111110 11111111 на второй строке – это маркер начала текста в UTF-16(требует по стандарту, PHP об этом ни черта не слышал). Этот скрипт выводит строку “UTF-16”, закодированную в UTF-16, потому что просто выводит байты между двух кавычек, что и выливается в текст «UTF-16», закодированный в UTF-16. C другой стороны, исходник не является полностью корректным ни в ASCII, ни в UTF-16, так что можете открыть редактор и повеселиться.

    Итого

    PHP поддерживает Unicode, или точнее, любую кодировку довольно точно до тех пор, пока вы можете заставить парсер выполнять его работу, а разработчика – понимать, что он делает. Нужно быть внимательным только при работе со строками: деление, удаление пробелов, подсчет и все другие операции, требующие работать с символами, а не байтами. Если ничего не делать со строками, кроме чтения и вывода, то вряд ли возникнут проблемы, которых нет в других языках.

    Языки с поддержкой кодировок

    Так что же тогда для языка значит поддерживать Unicode? Javascript например поддерживает Unicode. На самом деле любая строка в Javascript кодирована в UTF-8. И это единственная кодировка, с которой работает Javascript. Вам просто не получить в Javascript строку не в UTF-8. Javascript поклоняется Unicode в такой степени, что в ядре языка просто нет инструментов для работы с другой кодировкой. Раз уж Javascript чаще всего исполняется в браузере, у вас не возникает проблем: браузер способен исполнить тривиальную логику кодирования и декодирования ввода-вывода.

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

    Дебри Unicode

    Раз уж Unicode решает столько различных проблем и работает в множестве различных сценариев, приходится платить за это копанием в дебрях. К примеру, в стандарте Unicode содержится инфорация о решении таких проблем, как унификации иеороглифоф ЯКК . Множество символов, общих для Японии, Китая и Кореи, изображены немного по разному. Или проблемы конвертации символов из нижнего регистра в верхний, наоборот или туда-обратно, которая оказывается не всегда такой простой, как с кодировками западно-европейских языков. Некоторые символы могут быть представлены разными пунктами. Буква ö к примеру может быть представлена пунктом U+00F6(«ЛАТИНСКАЯ МАЛЕНЬКАЯ БУКВА О С ДИЕРЕЗИСОМ») или как два пункта U+006F(«МАЛЕНЬКАЯ БУКВА O») И U+0308(«ПОДСТАВЛЯЕМЫЙ ДИАРЕЗИС»), что значит буква o с ¨. В UTF-8 это либо 2 байта, либо 3 байта, которые в обоих случаях представляют собой нормальный символ. Поэтому есть правила нормализации в стандарте, т.е. как конвертировать эти формы из одной в другую. Это и многое другое находится вне материалов статьи, но об этих моментах нужно знать.

    Опять ниасилил!
    1. Текст – это всегда последовательность бит, которую нужно переводить на естественный язык с помощью таблиц. Неверная таблица – неверный символ.
    2. Нельзя работать напрямую с текстом – вы всегда работаете с битами, которые свернуты в абстракции. Ошибки связаны с ошибками в одной из абстракций.
    3. Системы, передающие друг другу информацию всегда должны указывать рабочую кодировку. Сайт например говорит браузеру, что он отдает информацию в UTF-8.
    4. В наше время UTF-8 обратно совместим с ASCII, несмотря на то, что может кодировать практически любой символ, и тем не менее относительно эффективен в большинстве случаев. Другие кодировки тоже находят применение, но должна быть серьезная причина, чтобы мучиться с кодировками, которые поддерживают только часть Unicode.
    5. С проблемой соответствия байта и символа должны разбираться оба: и программа, и программист.

    Теперь нечего оправдываться, когда вы вновь испортите текст.

    Теги: Добавить метки

    Одной из самых частых проблем, с которой сталкивается начинающий Web-мастер (да и не только начинающие), это проблемы с кодировкой на сайте . Даже у меня постоянно появляется при создании сайтов "абракадабра ". Но, благо, я прекрасно знаю, как эту проблему решить, поэтому всё привожу в порядок в течение нескольких секунд. И в этой статье я постараюсь научить Вас также быстро решать проблемы, связанные с кодировкой на сайте .

    Первое, что стоит отметить, это то, что все проблемы с появлением "абракадабры" связаны с несовпадением кодировки документа и кодировки, выставляемой браузером . Допустим, документ в windows-1251 , а браузер почему-то выставляет UTF-8 . А уже источником такого несовпадения могут быть следующие причины.

    Первая причина

    Неправильно прописан мета-тег content-type . Будьте внимательны, в нём всегда должна находиться та кодировка, в котором написан Ваш документ.

    Вторая причина

    Вроде бы, мета-тег прописан так, как Вы хотите, и браузер выставляет именно то, что Вы хотите, но почему-то всё равно с кодировкой проблемы. Здесь, почти наверняка, виновато то, что сам документ имеет отличную кодировку. Если Вы работаете в Notepad++ , то внизу справа есть название кодировки текущего документа (например, ANSI ). Если Вы ставите в мета-теге UTF-8 , а сам документ написан в ANSI , то сделайте преобразование в UTF-8 (через меню "Кодировки " и пункт "Преобразовать в UTF-8 без BOM ").

    Третья причина

    Четвёртая причина

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

    SET NAMES "utf8"

    Вместо "utf8 " может стоять другая кодировка. После этого все данные из базы должны выходить в правильной кодировке.

    В данной статье я, надеюсь, разобрал, как минимум, 90% проблем, связанных с появлением "абракадабры" на сайте . Теперь Вы должны расправляться с такой популярной и простой проблемой, как неправильная кодировка, в два счёта.