КОДИРОВАНИЕ СИМВОЛОВ. ВИДЫ КОДИРОВОК. 2

Сегодня мы поговорим с вами про то, откуда берутся кракозябры  на сайте и в программах, какие кодировки текста  существуют и какие из них следует использовать. Подробно рассмотрим историю развития кодировок начиная от базовой кодировки ASCII, а так же ее расширенных версий CP866, KOI8-R, Windows 1251 и заканчивая современными кодировками консорциума Юникод UTF 16 и UTF 8.

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

ASCII — базовая кодировка текста для латиницы

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

Но все же отправной точкой для развития современных кодировок текстов стоит считать знаменитую кодировку ASCII  (American Standard Code for Information Interchange, которая по русски обычно произносится как «аски»). Это кодировка, которая описывает первые 128 символов из наиболее часто используемых англоязычными пользователями — латинские буквы, арабские цифры и знаки препинания.

Так же еще в эти 128 символов кодировки ASCII попадали некоторые служебные символы, навроде скобок, решеток, звездочек и т.п. Собственно, вы сами можете увидеть эти самые 128 символов кодировки ASCII:

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

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

Нетрудно понять, что всех возможных комбинаций нулей и единиц в такой конструкции может быть только 256. Переводить число из двоичной системы в десятичную довольно просто. Нужно просто будет сложить все степени двойки, над которыми стоят единички. В нашем примере это получается 1 (2 в степени ноль) плюс 8 (два в степени 3), плюс 32 (двойка в пятой степени), плюс 64 (в шестой), плюс 128 (в седьмой). Итого получает 233 в десятичной системе счисления. Как видите все очень просто.

Но если вы присмотритесь к таблице с символами кодировки ASCII, то увидите, что эти символы представлены в шестнадцатеричной кодировке. Например, символ «звездочка» соответствует в ASCII шестнадцатеричному числу 2A. Наверное, вам известно, что в шестнадцатеричной системе счисления используются кроме арабских цифр еще и латинские буквы от A (означает десять) до F (означает пятнадцать).

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

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

Нужны ли кодировки текста, расширенные ASCII кодировки CP866, KOI8-R с псевдографикой

Итак, мы с вами начали говорить про кодировку текстов под названием ASCII, которая являлась как бы отправной точкой для развития всех современных кодировок (Windows 1251, юникод, UTF 8). Изначально в нее было заложено только 128 символов латинского алфавита, арабских цифр и еще чего-то там, но в расширенной версии кодировки ASCII появилась возможность использовать все 256 значений, которые можно закодировать в одном байте информации. Т.е. появилась возможность добавить в ASCII символы букв своего языка.

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

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

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

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

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

Видите, в правом столбце цифры кодировки начинаются с 8, т.к. цифры с 0 до 7 относятся к базовой кодировке ASCII (см. первый скриншот). Т.о. русская буква «М» в кодировке CP866 будет иметь код 9С (она находится на пересечении соответствующих строки с 9 и столбца с цифрой С в шестнадцатеричной системе счисления), который можно записать в одном байте информации и при наличии подходящего шрифта с русскими символами эта буква без проблем отобразится в тексте.

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

Кодировку CP866 распространяла компания IBM, но кроме этого для символов русского языка были разработаны еще ряд кодировок, которые являлись расширенными версиями кодировки ASCII. Например, к этому типу можно отнести кодировку KOI8-R :

Принцип работы кодировки KOI8-R тот же самый, что и у описанной чуть ранее CP866 — каждый символ текста кодируется одним единственным байтом. На скриншоте показана вторая половина таблицы KOI8-R, т.к. первая половина полностью соответствует базовой версии ASCII, которая показана на первом скриншоте в этой статье.

Среди особенностей кодировки KOI8-R можно отметить то, что русские буквы в ее таблице идут не в алфавитном порядке, как это, например, сделали в кодировке CP866. Если посмотрите на самый первый скриншот с базовой версией кодировки ASCII (которая входит во все расширенные кодировки), то заметите, что в KOI8-R русские буквы расположены в тех же ячейках таблицы, что и созвучные им буквы латинского алфавита из первой части таблицы. Это было сделано для удобства перехода с русских символов на латинские путем отбрасывания всего одного бита (два в седьмой степени или 128).

Windows 1251 (расширенная кодировка ASCII) и почему вылезают кракозябры вместо текста

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

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

Кодировка Windows 1251 выгодно отличалась от используемых ранее CP866 и KOI8-R тем, что место символов псевдографики в ней заняли недостающие символы русской типографики (окромя знака ударения), а так же символы, используемые в близких к русскому славянских языках (украинскому, белорусскому и т.д.):

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

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

Очень часто кракозябры вылезали при отправке и получении сообщений по электронной почте, что повлекло за собой создание очень сложных перекодировочных таблиц, которые, собственно, решить эту проблему в корне не смогли и зачастую пользователи для переписки использовали транслит латинских букв, чтобы избежать пресловутых кракозябров при использовании русских кодировок подобных CP866, KOI8-R или Windows 1251.

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

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

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

Юникод — появление универсальной кодировки текста (UTF 32, UTF 16 и UTF 8 )

Эти тысячи символов языковой группы юго-восточной Азии никак невозможно было описать в одном байте информации, который выделялся для кодирования символов в расширенных кодировках ASCII. В результате был создан консорциум под названием Юникод  (Unicode — Unicode Consortium ) при сотрудничестве многих лидеров IT индустрии (те, кто производит софт, кто кодирует железо, кто создает шрифты), которые были заинтересованы в появлении универсальной кодировки текста.

Первой кодировкой текста, вышедшей под эгидой консорциума Юникод, была кодировка UTF 32. Цифра в названии кодировки UTF 32 означает количество бит, которое используется для кодирования одного символа. 32 бита составляют 4 байта информации, которые понадобятся для кодирования одного единственного символа в новой универсальной кодировке UTF 32.

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

Но многим странам с языками европейской группы такое огромное количество символов использовать в кодировке вовсе и не было необходимости, однако при использовании UTF 32 они ни за что ни про что получали четырехкратное увеличение веса текстовых документов, а в результате и увеличение объема интернет трафика и объема хранимых данных. Это много и такое расточительство себе никто не мог позволить.

В результате развития универсальной кодировки Юникод появилась UTF 16. которая получилась настолько удачной, что была принята по умолчанию как базовое пространство для всех символов, которые у нас используются. UTF 16 использует два байта для кодирования одного символа. Например, в операционной системе Windows вы можете пройти по пути Пуск — Программы — Стандартные — Служебные — Таблица символов.

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

Сколько символов можно закодировать в UTF 16 с помощью 16 бит? 65 536 символов (два в степени шестнадцать) было принято за базовое пространство в Юникод. Помимо этого существуют способы закодировать с помощью UTF 16 около двух миллионов символов, но ограничились расширенным пространством в миллион символов текста.

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

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

В UTF 8 все латинские символы кодируются в один байт, так же как и в старой кодировке ASCII. Что примечательно, в случае кодирования только латиницы, даже те программы, которые не понимают Юникод, все равно прочитают то, что закодировано в UTF 8. Т.е. базовая часть кодировки ASCII перешла в UTF 8.

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

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

Кракозябры не пройдут — какую кодировку текста выбрать (UTF 8 без BOM или…)

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

В верхнем меню Notepad++ есть пункт «Кодировки», где у вас будет возможность преобразовать кодировку в тот вариант, который используется на вашем сайте по умолчанию:

В случае сайта на Joomla 1.5  и выше, а так же в случае блога на WordPress  следует во избежании появления кракозябров выбирать вариант кодировки UTF 8 без BOM. А что такое приставка BOM применительно к кодировке UTF 8?

Дело в том, что когда разрабатывали кодировку UTF 16 зачем то решили прикрутить к ней такую вещь, как возможность записывать код символа, как в прямой последовательности (например, 0A15), так и в обратной (150A). А для того, чтобы программы понимали в какой именно последовательности читать код символа в UTF 16 и был придуман BOM  (Byte Order Mark или другими словами — сигнатура), которая выражалась в добавлении трех дополнительных байтов в самое начало документов.

В кодировке UTF 8 никаких BOM предусмотрено в консорциуме Юникод не было и поэтому добавление сигнатуры (этих самых пресловутых дополнительных трех байтов в начало документа) некоторым программам просто-напросто мешает читать кодировку Юникод. Поэтому мы всегда при сохранении файлов в кодировке UTF 8 должны выбирать вариант без BOM (без сигнатуры). Таким образом, вы заранее обезопасите себя от вылезания кракозябров.

Что примечательно, некоторые программы в Windows не умеют этого делать (не умеют сохранять текст в UTF 8 без BOM ), например, все тот же пресловутый Блокнот Windows. Он сохраняет документ в UTF 8, но все равно добавляет в его начало сигнатуру (три дополнительных байта). Причем эти байты сигнатуры UTF 8 будут всегда одни и те же — читать код в прямой последовательности. Но на серверах из-за этой мелочи может возникнуть проблема — вылезут кракозябры.

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

В редакторе Notepad++ при выборе кодировки у вас будет возможность преобразовать текст в кодировку UCS-2, которая по своей сути очень близка с стандарту Юникод UTF 16. Так же в Notepad++ можно будет закодировать текст в ANSI, т.е. применительно к русскому языку это будет уже описанная нами чуть выше кодировка Windows 1251. Откуда берется эта информация?

Она прописана в реестре вашей операционной системы Windows — какую кодировку выбирать в случае ANSI, какую выбирать в случае OEM (для русского языка это будет CP866). Если вы установите на своем компьютере другой язык по умолчанию, то и эти кодировки будут заменены на аналогичные из разряда ANSI или OEM для того самого языка.

После того, как вы в Notepad++ сохраните документ в нужной вам кодировке или же откроете документ с сайта для редактирования, то в правом нижнем углу редактора вы сможете увидеть название кодировки текста  в этом документе:

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

Вообще, во всех языках гипертекстовой разметки кроме Html используется специальное объявление xml, в котором указывается кодировка текста.

Источник: blog.steptothefuture.net

Категория: Программное обеспечение

Похожие статьи: