Проблемы для кодирования национальных алфавитов.

Авто 15.06.2019
Авто

Если последовательность бит не выглядит разумной(с точки зрения человека), то это случай, когда документ скорее всего был неверно сконвертирован в определенный момент. К примеру мы берем текст É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. С проблемой соответствия байта и символа должны разбираться оба: и программа, и программист.

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

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

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

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

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

ВВВЕДЕНИЕ.

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

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

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

Для любой операции над информацией (даже такой простой, как сохранение) она должна быть как-то представлена (записана, зафиксирована). Этот процесс имеет специальное название – кодирование информации.

ПРЕДСТАВЛЕНИЕ И КОДИРОВАНИЕ ИНФОРМАЦИИ.

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

Кодирование информации необычайно разнообразно. Указания водителю автомобиля кодируются в виде дорожных знаков. Музыкальное произведение кодируется с помощью знаков нотной грамоты, для записи шахматных партий и химических формул созданы специальные системы записи. Любой грамотный компьютерный пользователь знает о существовании кодировок символов. Географическая карта кодирует информацию о местности. Необходимость кодирования речевой информации возникла в связи с бурным развитием техники связи, особенно мобильной связи. Людьми были придуманы специальные коды: Азбука Брайля, азбука Морзе, флажковая азбука. Таких примеров можно приводить очень много.

Известно, что одну и ту же информацию мы можем выразить разными способами.

Например, каким образом вы можете сообщить об опасности?

  • Если на вас напали, вы можете просто крикнуть: “Караул!!” (англичанин крикнет “Неlр me!”).
  • Если прибор находится под высоким напряжением, то требуется оставить предупреждающий знак (рисунок).
  • На оживленном перекрестке регулировщик помогает избежать аварии с помощью жестов.
  • В театре пантомимы вся информация передается зрителю исключительно с помощью мимики и жестов.
  • Если ваш корабль тонет, то вы передадите сигнал “SОS” (...– – –...).
  • На флоте помимо азбуки Морзе используют также семафорную и флажковую сигнализацию.

Набор знаков, в котором определен их порядок, называется алфавитом.

Существует множество алфавитов.

  • Алфавит кириллических букв (А, Б, В, Г, Д, Е, ...)
  • Алфавит латинских букв (А, В, С, D, Е, F, ...)
  • Алфавит десятичных цифр(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
  • Алфавит знаков зодиака (^ , _ , ` , a , b , c , d , e , f , g , h , i) и др.

Имеются, однако, наборы знаков, для которых нет какого-то общепринятого порядка:

  • Набор знаков азбуки Брайля (для слепых);
  • Набор китайских идеограмм;
  • Набор знаков планет;
  • Набор знаков генетического кода (А, Ц, Г, Т).

Особенно важное значение имеют наборы, состоящие всего из двух знаков:

  • Пара знаков (+, –);
  • Пара знаков “точка”, “тире” (., –)
  • Пара цифр (0, 1).
  • Пара ответов (да, нет).

Таким образом, кодирование информации – это процесс формирования определенного представления информации. Значимость кодирования возросла в последние десятилетия в связи с внедрением ЭВМ.

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

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

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

Код, знак и язык позволяют передавать информацию в символическом виде, удобном для ее кодирования

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

ПРАКТИЧЕСКОЕ ПРИМЕНЕНИЕ КОДИРОВАНИЯ ИНФОРМАЦИИ.

Стенография – это скоростное письмо особыми знаками, настолько краткими, что ими можно записать живую речь. Стенография пришла к нам из древнейших времен. Еще в Древнем Египте скорописцы записывали речь фараонов. Широкое распространение стенография получила в Древней Греции. В 1883 г. в Акрополе была найдена мраморная плита, на которой были высечены стенографические знаки. По мнению ученых, эти записи были сделаны в 350 г. до н.э. Но общепризнанным днем рождения стенографии считается 5 декабря 63 года до н.э. Тогда в Древнем Риме возникла необходимость дословной записи устной речи. Автором древнеримской стенографии считается Тирон – секретарь знаменитого оратора Цицерона.

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

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

Телефонный план нумерации.

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

Персональные данные.

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

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

Штрих-коды.

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

В настоящее время в России и за рубежом ведутся большие работы по созданию автоматизированных систем обработки данных с применением машиночитаемых документов (МЧД), одной из разновидностей которых являются документы со штриховыми кодами. К машиночитаемым относятся товаросопроводительные документы, ярлыки и упаковки товаров, чековые книжки и пластиковые карточки для оплаты услуг, магнитные носители. В связи с этим появились термины “электронные ведомости”, “электронные деньги” и т. д.

Наиболее перспективным и быстроразвивающимся направлением автоматизации процесса ввода информации в ЭВМ является применение штриховых кодов.

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

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

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

Товарный штриховой код присваивается продукции (товару) на этапе запуска его в производство. Штрих-коды получили широкое практическое применение почти во всех сферах деятельности человека (Приложение 3) :

  • Штриховое кодирование помогает в приготовлении медицинских препаратов;
  • Превосходная сортировка;
  • Штрих-коды наводят порядок на складе;
  • Вы можете стать штрих-кодом!
  • Штрих-коды охраняют детей;
  • Общее наблюдение за частной жизнью;
  • Штрих-коды контролируют гарантийное обслуживание;
  • Штрих-коды в аэропорту избежать путаницы;
  • Штрих-коды и скоропортящиеся продукты;
  • Карты безопасности;
  • Штрих-коды следят за заключенными;
  • Газеты в будущем;
  • Штрих-коды помогают найти выгодную цену;
  • Штрих-коды как искусство;
  • Штрих-коды не пропустят `зайцев`;
  • Штрих-коды отлавливают прогульщиков;
  • Процесс выписки рецептов;
  • Штриховое кодирование и медицина;
  • Штрих-коды и гонки Формулы 1;
  • Мобильный телефон вместо билета на концерт;
  • Штрих-код охраняет детей;
  • Шифровка диагнозов заболеваний в листках нетрудоспособности?

Смайлики.

Смайликами (от smile – улыбка) в Интернете называют значки, составленные из знаков препинания, букв и цифр, обозначающие какие-то эмоции.

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

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

ЗАКЛЮЧЕНИЕ.

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

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

  • Артур Конан Дойль “Пляшущие человечки”;
  • Эдгар По “Золотой жук”;
  • Жюль Верн “Путешествие к центру земли”;
  • Валентин Каверин “Исполнение желаний”;
  • Дэн Браун “Код да Винчи”;
  • Дэвид Кан “Взломщики кодов”.

Для наглядности представления материала может быть использованы слайды презентации из

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Как в памяти компьютера хранятся символы (буквы)?

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

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

Однако алфавитов в мире очень много (английский, русский, китайский и др.). Поэтому следующий вопрос:

Как закодировать все используемые на компьютере алфавиты?

Для ответа на этот вопрос пойдем историческим путем.

В 60-х годах XX века в американском национальном институте стандартизации (ANSI) была разработана таблица кодирования символов, которая впоследствии была использована во всех операционных системах. Эта таблица называется ASCII (American Standard Code for Information Interchange – американский стандартный код для обмена информацией). Чуть позже появилась расширенная версия ASCII.

В соответствие с таблицей кодирования ASCII для представления одного символа выделяется 1 байт (8 бит). Набор из 8 ячеек может принять 28 = 256 различных значений. Первые 128 значений (от 0 до 127) постоянны и формируют так называемую основную часть таблицы, куда входят десятичные цифры, буквы латинского алфавита (заглавные и строчные), знаки препинания (точка, запятая, скобки и др.), а также пробел и различные служебные символы (табуляция, перевод строки и др.). Значения от 128 до 255 формируют дополнительную часть таблицы, где принято кодировать символы национальных алфавитов.

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

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

Третья проблема - что делать, если в тексте используется несколько языков (например, русский, английский и французский)? Нельзя же использовать две таблицы сразу …

Чтобы решить эти проблемы одним разом была разработана кодировка Unicode.

Стандарт кодирования символов Unicode

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

В Unicode для кодирования символов предоставляется 31 бит (4 байта за вычетом одного бита). Количество возможных комбинаций дает запредельное число: 231 = 2 147 483 684 (т.е. более двух миллиардов). Поэтому Unicode описывает алфавиты всех известных языков, даже «мертвых» и выдуманных, включает многие математические и иные специальные символы. Однако информационная емкость 31-битового Unicode все равно остается слишком большой. Поэтому чаще используется сокращенная 16-битовая версия (216 = 65 536 значений), где кодируются все современные алфавиты.

В Unicode первые 128 кодов совпадают с таблицей ASCII.



Рекомендуем почитать

Наверх