inf_lab1

advertisement
История
Развитие кодировок происходило одновременно с развитием области IT. Первой кодировкой
была EBCDIC, позволявшая кодировать только буквы латинского алфавита, арабские
цифры и знаки пунктуации, а так же управляющие символы. Но зачастую первой
кодировкой считают ASCII(American Standart Code for Information Interchange). Эта
кодировка позволяет описывать 128 символов, среди них: арабские и латинские буквы,
знаки препинания, и служебные символы. Эти 128 символов в будущем и становились
основой любой другой кодировки, их включали в новую кодировку именно в таком порядке.
Кодировка ASCII однобайтовая, но с помощью одного байта можно закодировать не 128, а
256 различных символов, поэтому стали появляться различные расширенные кодировки
ASCII, в которых помимо основных 128 символов кодировались ещё и символы
национальной кодировки. Примерами таких кодировок были KOI8-R, группа страниц
ISO8859. В дальнейшем был создан консорциум Unicode, которым были разработаны
кодировки UTF32, UTF16, UTF8.
EBCDIC(Extended Binary Coded Decimal Interchange Code)
Была создана создана корпорацией IBM для использования на мэйнфрэймах собственного
производства и других, совместимых с ними. Включала в себя буквы латинского алфавита,
арабские цифры, некоторые знаки пунктуации и управляющие символы. Существовало, как
минимум, шесть версий EBCDIC не совместимых между собой.
ДКОИ-8
Российский аналог EBCDIC
CP866
Однобайтовая расширенная
ASCII
кодировка
с
поддержкой
русского
алфавита, и, что самое
важное,
с
элементами
псевдографики.
CP866
разрабатывалась достаточно
давно, когда графические
системы
были
не
распространены, поэтому были добавлены элементы псевдографики для создания
псевдографического интерфейса в текстовом терминале. Кодировка CP866 поддерживалась
компанией IBM.
KOI7
Семибитная кодировка русского языка, основанная на ASCII соответствует ГОСТ 1305274(недействителен). Включает в себя три набора H0, H1, H2. Набор H0 — это просто USASCII, в H1 все латинские буквы заменены на русские, а символ доллара заменён на символ
валюты; в H2 заглавные латинские буквы оставлены, а строчные заменены на заглавные
русские, символ доллара так же заменён. Наличие только заглавных букв не создавало
проблем, так как до 90-х годов существовала традиция использовать только заглавные
буквы в текстах программ. На практике либо H2 использовался сам по себе, либо
использовали H0/H1 с переключением, для перехода в русский «режим» использовался
управляющий символ 0xE, а для возврата в H0 символ 0xF иногда смена осуществлялась
ручным переключателем. Стоит так же отметить что эта кодировка не содержала буквы Ё и
заглавной буквы ъ. Поскольку русские буквы были размещены на позициях аналогичных
латинских букв, текст оставался более-менее понятным даже при не правильно выбранном
режиме.
KOI8-R
Так же однобайтовая
кодировка, основанная
на ASCII. В основном
схожа с CP866, однако
символы русского
алфавита идут не в
алфавитном порядке.
Стоит отметить, что
если KOI8-R
используется и по сей
день Разработчики
КОИ-8 поместили
символы русского
алфавита в верхней
части кодовой
таблицы таким
образом, что позиции кириллических символов соответствуют их фонетическим аналогам в
английском алфавите в нижней части таблицы. Это означает, что если в тексте, написанном
в КОИ-8, убирать восьмой бит каждого символа, то получается «читаемый» текст, хотя он и
написан латинскими символами. Например, слова «Русский Текст» превратились бы в
«rUSSKIJ tEKST». Как побочное следствие, символы кириллицы оказались расположены не
в алфавитном порядке. Существует несколько вариантов кодировки КОИ-8 для различных
кириллических алфавитов, расширяющие определённые коды (общий диапазон 192—255 с
32 русскими буквами в двух регистрах остаётся неизменным во всех вариантах). Русский
алфавит описывается в кодировке KOI8-R, украинский — в KOI8-U.
IETF утвердил несколько RFC по вариантам кодировки KOI8-R:
 RFC1489 — KOI8-R
 RFC2319 — KOI8-R
 RFC1345 — ISO-IR-111(с ошибкой в определении основного основного диапазона)
Дальнейшее развитие кодировок было связано с развитием графических операционных
систем. Отпала необходимость использования псевдографики. Стали появляться кодировки
без символов псевдографики. Такие кодировки относились к ANSI кодировкам,
разработанным американским институтом стандартизации. Появилась кодировка Windows
1251 отличалась от используемых ранее тем, что вместо символов псевдографики в ней
появились символы русской типографики(исключая знак ударения), а так же символы
используемые в близких русскому славянских языках.
Из-за обилия кодировок у производителей шрифтов появлялось больше работы, а
пользователи иногда могли наблюдать на своём экране, так называемые, «кракозябры», при
выборе неправильной кодировки.
ISO8859
ISO8859 — это семейство ASCII-совместимых кодовых страниц разработанное
совместными усилиями ISO и IEC.
ISO8859 разрабатывались как кодировки для обмена информацией, а не как средства
качественной типографики, по этой причине в них отсутствуют такие символы, как парные
кавычки, тире разной длины, лигатуры, но довольно много места зарезервировано для под
«верхние управляющие символы», предназначенные для управления терминалами. Так как
все кодировки ISO8859 разрабатывались совместно, то они обладают совместимостью друг
с другом. Например все семь символов расширенной латиницы для немецкого языка стоят
на одинаковых позициях во всех страницах которые их включают.
Windows-1251
Windows-1251 — набор символов и кодировка, являющаяся стандартной 8-битной
кодировкой для всех русских версий MS Windows. Пользуется большой популярностью.
Была создана на базе кодировок, использовавшихся в ранних неофициальных
русификаторов для Windows совместно представителями «Параграфа», «Диалога» и
росийского отделения MS. Первоначальный вариант кодировки отличался от современного.
Windows-1251 отличалась от других 8-битных кодировок того времени(таких как KOI8-R,
CP866 и ISO8859-5) наличием практически всех символов, использующихся в русской
типографике для обычного текста(неприсутствует только значок ударения). Она также
содержит все символы для близких русскому языков.
Имеет два основных недостатка:
 Строчная буква «я» имеет код «0xFF»(255 в десятичной с-ме). Она является
причиной ряда неожиданных проблем в программах без поддержки «8-го бита», а
также в программах, использующих этот код как служебный(например в CP437 этот
код обозначает «неразрывный пробел»); число -1 в дополнительном коде длиной 8
бит представляется числом 255, часто используется как специальное значиние,
например EOF.
 Отсуствуют символы псевдографики имеющиеся в CP866 и KOI8
Универсальная кодировка текста юникод(UTF32,UTF16,UTF8)
Предпосылками к созданию Unicode стали :
1. Проблема «кракозябр»(отображения документов в неправильной кодировке).
Она решалась либо последовательным внедрением методов указания
кодировки, либо введением единой кодировки
2. Проблема ограниченности набора символов.
3. Проблема преобразования одной кодировки в другую, она решалась
использованием таблиц перекодировки для каждой пары кодировок либо
промежуточным кодированием в третью кодировку, включающую символы
всех кодировок
4. Проблема дублирования традиционно для каждой кодировки делался свой
шрифт, даже если эти кодировки частично (или полностью) совпадали по
набору символов: эту проблему можно было решить, делая «большие»
шрифты, из которых потом выбираются нужные для данной кодировки
символы.
Со временем одного байта информации стало не хватать для описания всех символов,
например для описания символов языков юго-восточной Азии. В результате было решено
создать консорциум Юникод (Unicode Consortium) при сотрудничестве ведущих компаний в
мире IT, которые были заинтересованы в появлении универсальной кодировки текста.
Цифра в названии кодировки UTF означает количество бит, используемых для кодирования
одного символа. Сначала появилась UTF32, которая использовала для кодирования одного
символа 4 байта, тоесть файл закодированный с помощью одной из кодировок ASCII весил
в четыре раза меньше, чем тот же файл закодированный с помощью UTF32, что было
весьма не удобно и расточительно. В результате эволюции появилась UTF16, получившаяся
весьма удачной, настолько. Но она всё равно была слишком расточительна для тех, кто
писал только на английском языке. В результате была создана кодировка переменной длины
UTF8. Каждый символ в этой кодировке может быть закодирован кодом длинной от 1 до 6
байт. На практике обычно используется диапазон от 1 до 4 байт. В UTF8 все латинские
символы кодируются в один байт, что даёт обратную совместимость с программами,
которые не созданы для работы с юникодом. Крилица же кодируется двумя байтами.
Версии юникода:
 1.1(соответствует стандарту ISO/IEC 10646-1:1993) стандарт 1991-1995 годов
 2.0, 2.1(тот же стандарт ISO/IEC 10646—1:1993 плюс дополнения:
«Amendments» с 1-го по 7-е и «Technical Corrigenda» 1 и 2), стандарт 1996
года.
 3.0 (стандарт ISO/IEC 10646—1:2000), стандарт 2000 года.
 3.2 стандарт 2002 года.
 4.0 стандарт 2003 года.
 4.1 стандарт 2005 года.
 5.0 стандарт 2006 года.
 5.1 стандарт 2008 года.
 5.2 стандарт 2009 года.
 6.0 стандарт 2010 года.
 6.1 стандарт 2012 года.
Принципы работы UTF8
Интересен принцип кодирования в UTF8. Текст, который состоит только из символов с
номером меньше 128 превращается в текст с кодировкой ASCII. Остальные символы могут
занимать от 2 до 6 байт(на практике до 4 байт, поскольку на данный момент нет символов с
кодом больше 0x10FFF и вводить их не планируется),в которых первый байт всегда имеет
вид 11xxxxxx а остальные 10xxxxxx. Символы UTF8 из Unicode получаются следующим
образом:
0x00000000 — 0x0000007F: 0xxxxxxx
0x00000080 — 0x000007FF: 110xxxxx 10xxxxxx
0x00000800 — 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 — 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Проблемы Юникода
 Тексты на китайском, корейском и японском языках имеют традиционное написание
сверху вниз, начиная с правого верхнего угла. Переключение горизонтального и
вертикального написания для этих языков не предусмотрено в Юникоде — это
должно осуществляться средствами языков разметки или внутренними механизмами
текствовых процессоров
 Юников предусматривает возможность разных начертаний одного и того же символа
в зависимости от языка. Так, китайские иероглифы могут иметь разные начертания в
китайском, японском и корейском, но при этом в Юникоде обозначаться одним и тем
же символом(так называемая CJK-унификация), хотя упрощённые и полные
иероглифы всё же имеют разные коды. Часто возникают проблемы, когда, например,
японский текст выглядит как китайский. Аналогично, русский и сербский языки
используют разное начертание курсивных букв. Поэтому важно следить, чтобы текст
всегда был правильно помечен как относящийся к тому или иному языку.
 Перевод из строчных букв в заглавные тоже зависит от языка. Например в турецком
существуют буквы İi и Iı — таким образом, турецкие правила изменения регистра
конфликтуют с английскими, которые предписывают i переводить в I. Подобные
проблемы есть и в других языках.
 Даже с арабскими цифрами есть определённые типографические тонкости: цифры
бывают «прописными» и «строчными», пропорциональными или моношринными —
для юникода разницы между ними нет. Подобные нюансы остаются за ПО.
Для чего нужны кодировки
Так как компьютер может работать только с числами, а человеку это не удобно,
понадобился
способ представления символов в памяти компьютера. Для этого были созданы таблицы
символов которые определяли соответствие между сиволовом и его численным
представлением.
Использование множества кодировок в современном ПО создаёт много неудобств не только
программистам, но и пользователям. Согласно одной точке зрения, справиться с
кракозябрами можно, если программы будут автоматически распознавать кодировку
входящего текста.
Для однобайтных кодировок можно учитывать тот факт, что частота использования разных
букв сильно различается (например, в русском часто используется «о», но редко «ъ»).
Поэтому, зная язык текста, можно легко выбрать кодировку, в которой частота байтов лучше
соответствует частоте букв данного языка.
Альтернативная точка зрения считает подобные эвристические алгоритмы определения
кодировки текста вредными, поскольку современные информационные технологии
располагают средствами недвусмысленно сопоставить тексту положенную ему кодовую
страницу (см., например, MIME). Широкое же распространение эвристических
анализаторов поощряет использование некачественных программ создания текстовых
данных, нарушающих стандарты.
Download