Вы находитесь на странице: 1из 12

В настоящее время в основном используются кодировки двух типов: совместимые с ASCII и

совместимые с EBCDIC[2], с подавляющим преобладанием первых. В ASCII-совместимых кодировках


фиксированы коды 95 печатных символов и 33 управляющих, а остальные 128 кодовых позиций
используются для различных символов, не входящих в ASCII.
Для кодирования текстов на русском языке (то есть букв кириллицы) наиболее широко
применяются следующие кодовые страницы:
● Windows-1251, она же Microsoft code page 1251 (CP1251) — в системах Windows; ANSI -
( American National Standards Institute) кодировка используемая в Windows, точнее, это
псевдоним для текущей кодировки из системной локали виндоуза. Для американцев это
будет win-1252 (western), для маломало русифицированного компьютера — win-1251
(cyrillic).
● Семейство кодовых страниц KOI8;
● Альтернативная кодировка, она же IBM code page 866 — в системах DOS, а также в
текстовых окнах Microsoft Windows ;
● MacCyrillic — на компьютерах Macintosh.
Использование различных кодовых страниц создаёт много неудобств как для пользователей, так и
для программистов. При попытке прочесть текстовый файл при помощи кодовой страницы,
несовместимой с той в которой он был создан, возникают кракозябры.
ASCII — (American Standard Code for Information Interchange, которая по-русски обычно
произносится как «аски») 7-битная кодировка. Изначально применялась на терминалах, т.е. со времён
PDP, если не раньше.
Является отправной точкой для развития современных кодировок текстов. Она описывает первые
128 символов из наиболее часто используемых англоязычными пользователями — латинские буквы,
арабские цифры и знаки препинания.
Еще в эти 128 знаков, описанных в ASCII, попадали некоторые служебные символы навроде
скобок, решеток, звездочек и т.п. Собственно, вы сами можете увидеть их:

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

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

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

Дальнейшее развитие кодировок текста было связано с тем, что набирали популярность
графические операционные системы и необходимость использования псевдографики в них со
временем пропала. В результате возникла целая группа, которая по своей сути по-прежнему являлись
расширенными версиями Аски (один символ текста кодируется всего одним байтом информации), но
уже без использования символов псевдографики.
Они относились к так называемым ANSI ( American National Standards Institute) кодировкам,
которые были разработаны американским институтом стандартизации. В просторечии еще
использовалось название кириллица для варианта с поддержкой русского языка. Примером такой
может служить Windows 1251.
Она выгодно отличалась от используемых ранее CP866 и KOI8-R тем, что место символов
псевдографики в ней заняли недостающие символы русской типографики (кроме знака ударения), а
также символы, используемые в близких к русскому славянских языках (украинскому, белорусскому
и т.д.):
Таблица Windows 1251

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


программного обеспечения постоянно возникала головная боль, а у нас с вам, уважаемые читатели,
зачастую вылезали те самые пресловутые кракозябры, когда происходила путаница с используемой в
тексте версией.
Очень часто они вылезали при отправке и получении сообщений по электронной почте, что
повлекло за собой создание очень сложных перекодировочных таблиц, которые, собственно, решить
эту проблему в корне не смогли, и зачастую пользователи для переписки использовали транслит
латинских букв, чтобы избежать пресловутых кракозябров при использовании русских кодировок
подобных CP866, KOI8-R или Windows 1251.
По сути, кракозябры, вылазящие вместо русского текста, были результатом некорректного
использования кодировки данного языка, которая не соответствовала той, в которой было
закодировано текстовое сообщение изначально.
Например, напишем в NOTEPAD++ слово “Привет”, в кодировке windows-1251 (по умолчанию),
затем заменим кодировку на OEM866 и увидим ╧Ёштх. Если сравнить кодовые странички то станет
понятно почему текст стал выглядеть именно так.
Допустим, если символы, закодированные с помощью CP866, попробовать отобразить,
используя кодовую таблицу Windows 1251, то эти самые кракозябры (бессмысленный набор знаков) и
вылезут, полностью заменив собой текст сообщения.
Аналогичная ситуация очень часто возникает при создании и настройке сайтов, форумов или
блогов, когда текст с русскими символами по ошибке сохраняется не в той кодировке, которая
используется на сайте по умолчанию, или же не в том текстовом редакторе, который добавляет в код
отсебятину не видимую невооруженным глазом.
В конце концов такая ситуация с множеством кодировок и постоянно вылезающими
кракозябрами многим надоела, появились предпосылки к созданию новой универсальной вариации,
которая бы заменила собой все существующие и решила бы, наконец, на корню проблему с
появлением не читаемых текстов. Кроме этого существовала проблема языков подобных китайскому,
где символов языка было гораздо больше, чем 256.
Юникод (Unicode) — универсальные кодировки UTF 8, 16 и 32

Эти тысячи знаков языковой группы юго-восточной Азии никак невозможно было описать в
одном байте информации, который выделялся для кодирования символов в расширенных версиях
ASCII. В результате был создан консорциум под названием Юникод (Unicode — Unicode
Consortium) при сотрудничестве многих лидеров IT индустрии.
Первой вариацией, вышедшей под эгидой консорциума Юникод, была UTF 32. Цифра в
названии кодировки означает количество бит, которое используется для кодирования одного
символа. 32 бита составляют 4 байта информации, которые понадобятся для кодирования одного
единственного знака в новой универсальной кодировке UTF.
В результате чего, один и тот же файл с текстом, закодированный в расширенной версии
ASCII и в UTF-32, в последнем случае будет иметь размер (весить) в четыре раза больше. Это
плохо, но зато теперь у нас появилась возможность закодировать с помощью ЮТФ число знаков,
равное двум в тридцать второй степени (миллиарды символов, которые покроют любое реально
необходимое значение с колоссальнымзапасом).
Но многим странам с языками европейской группы такое огромное количество знаков
использовать в кодировке вовсе и не было необходимости, однако при задействовании UTF-32 они
ни за что ни про что получали четырехкратное увеличение веса текстовых документов, а в
результате и увеличение объема интернет трафика и объема хранимых данных. Это много, и такое
расточительство себе никто не мог позволить.
В результате развития Юникода появилась UTF-16, которая получилась настолько удачной,
что была принята по умолчанию как базовое пространство для всех символов, которые у нас
используются. Она использует два байта для кодирования одного знака. Давайте посмотрим, как
это дело выглядит.
В операционной системе Windows вы можете пройти по пути «Пуск» — «Программы» —
«Стандартные» — «Служебные» — «Таблица символов». В результате откроется таблица с
векторными формами всех установленных у вас в системе шрифтов. Если вы выберете в
«Дополнительных параметрах» набор знаков Юникод, то сможете увидеть для каждого шрифта в
отдельности весь ассортимент входящих в него символов.
Кстати, щелкнув по любому из них, вы сможете увидеть его двухбайтовый код в формате
UTF-16, состоящий из четырех шестнадцатеричных цифр:

Сколько символов можно закодировать в UTF-16 с помощью 16 бит? 65 536 (два в степени
шестнадцать), и именно это число было принято за базовое пространство в Юникоде. Помимо
этого существуют способы закодировать с помощью нее и около двух миллионов знаков, но
ограничились расширенным пространством в миллион символов текста.
Но даже эта удачная версия кодировки Юникода не принесла особого удовлетворения тем,
кто писал, допустим, программы только на английском языке, ибо у них, после перехода от
расширенной версии ASCII к UTF-16, вес документов увеличивался в два раза (один байт на один
символ в Аски и два байта на тот же самый символ в ЮТФ-16).
Вот именно для удовлетворения всех и вся в консорциуме Unicode было решено придумать
кодировку переменной длины. Ее назвали UTF-8. Несмотря на восьмерку в названии, она
действительно имеет переменную длину, т.е. каждый символ текста может быть закодирован в
последовательность длиной от одного до шести байт.
На практике же в UTF-8 используется только диапазон от одного до четырех байт, потому
что за четырьмя байтами кода ничего уже даже теоретически не возможно представить. Все
латинские знаки в ней кодируются в один байт, так же как и в старой доброй ASCII.
Что примечательно, в случае кодирования только латиницы, даже те программы, которые не
понимают Юникод, все равно прочитают то, что закодировано в ЮТФ-8. Т.е. базовая часть Аски
просто перешла в это детище консорциума Unicode.
Кириллические же знаки в UTF-8 кодируются в два байта, а, например, грузинские — в три
байта. Консорциум Юникод после создания UTF 16 и 8 решил основную проблему — теперь у нас
в шрифтах существует единое кодовое пространство. И теперь их производителям остается
только исходя из своих сил и возможностей заполнять его векторными формами символов текста.
В приведенной чуть выше «Таблице символов» видно, что разные шрифты поддерживают
разное количество знаков. Некоторые насыщенные символами Юникода шрифты могут весить
очень прилично. Но зато теперь они отличаются не тем, что они созданы для разных кодировок, а
тем, что производитель шрифта заполнил или не заполнил единое кодовое пространство теми или
иными векторными формами до конца.

Кракозябры вместо русских букв — как исправить

Давайте теперь посмотрим, как появляются вместо текста кракозябры или, другими словами,
как выбирается правильная кодировка для русского текста. Собственно, она задается в той
программе, в которой вы создаете или редактируете этот самый текст, или же код с
использованием текстовых фрагментов.
В верхнем меню Notepad++ есть пункт «Кодировки», где у вас будет возможность
преобразовать уже имеющийся вариант в тот, который используется на вашем сайте по
умолчанию:
В случае сайта на Joomla 1.5 и выше, а также в случае блога на WordPress следует во
избежании появления кракозябров выбирать вариант UTF 8 без BOM. А что такое приставка
BOM?
Дело в том, что когда разрабатывали кодировку ЮТФ-16, зачем-то решили прикрутить к ней
такую вещь, как возможность записывать код символа, как в прямой последовательности
(например, 0A15), так и в обратной (150A). А для того, чтобы программы понимали, в какой
именно последовательности читать коды, и был придуман BOM (Byte Order Mark или, другими
словами, сигнатура), которая выражалась в добавлении трех дополнительных байтов в самое
начало документов.
В кодировке UTF-8 никаких BOM предусмотрено в консорциуме Юникод не было и поэтому
добавление сигнатуры (этих самых пресловутых дополнительных трех байтов в начало документа)
некоторым программам просто-напросто мешает читать код. Поэтому мы всегда при сохранении
файлов в ЮТФ должны выбирать вариант без BOM (без сигнатуры). Таким образом, вы заранее
обезопасите себя от вылезания кракозябров.
Один символ кодировки UTF-16 представлен последовательностью двух байтов или двух пар байтов.
Который из двух идёт впереди, старший или младший, зависит от порядка байтов. Систему, совместимую с
процессорами x86, называют little endian, а с процессорами m68k и SPARC — big endian.
Для определения порядка байтов используется метка порядка байтов (англ. Byte order mark). В начале текста
записывается код U+FEFF. При считывании, если вместо U+FEFF считалось U+FFFE, значит порядок байтов
обратный, поскольку символа с кодом и U+FFFE в Юникоде нет. Так как в кодировке UTF-8 не используются
значения 0xFE и 0xFF, можно использовать метку порядка байтов как признак, позволяющий различать UTF-16
и UTF-8.
UTF-16LE и UTF-16BE Предусмотрена также возможность внешнего указания порядка байтов — для этого
кодировка должна быть описана как UTF-16LE или UTF-16BE (little-endian / big-endian), а не просто UTF-16. В
этом случае метка порядка байтов (U+FEFF) не нужна.
Что примечательно, некоторые программы в Windows не умеют этого делать (не умеют
сохранять текст в ЮТФ-8 без BOM), например, все тот же пресловутый Блокнот Windows. Он
сохраняет документ в UTF-8, но все равно добавляет в его начало сигнатуру (три дополнительных
байта). Причем эти байты будут всегда одни и те же — читать код в прямой последовательности.
Но на серверах из-за этой мелочи может возникнуть проблема — вылезут кракозябры.
Поэтому ни в коем случае не пользуйтесь обычным блокнотом Windows для
редактирования документов вашего сайта, если не хотите появления кракозябров. Лучшим и
наиболее простым вариантом я считаю уже упомянутый редактор Notepad++, который
практически не имеет недостатков и состоит из одних лишь достоинств.
В Notepad ++ при выборе кодировки у вас будет возможность преобразовать текст в
кодировку UCS-2, которая по своей сути очень близка к стандарту Юникод. Также в Нотепаде
можно будет закодировать текст в ANSI, т.е. применительно к русскому языку это будет уже
описанная нами чуть выше Windows 1251. Откуда берется эта информация?
Она прописана в реестре вашей операционной системы Windows — какую кодировку
выбирать в случае ANSI, какую выбирать в случае OEM (для русского языка это будет CP866).
Если вы установите на своем компьютере другой язык по умолчанию, то и эти кодировки будут
заменены на аналогичные из разряда ANSI или OEM для того самого языка.
После того, как вы в Notepad++ сохраните документ в нужной вам кодировке или же
откроете документ с сайта для редактирования, то в правом нижнем углу редактора сможете
увидеть ее название:

Формат RTF - пример начала файла в NOTEPAD++


{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang1031\deflangfe1031{\font
tbl{\f0\froman\fcharset204\fprq2{\*\panose

HEX: 7B 5C 72 74 66

ASCII: {\rtf

Формат DOC
HEX: D0 CF 11 E0 A1 B1 1A E1

ASCII, расш.: РП.а...б

Формат DOCX

HEX: 50 4B 03 04

ASCII: PK

Файл DOCX - документ, созданный с помощью Microsoft Word 2007 или более новой версии Office. Формат файла
основан на Open XML и использует сжатие по алгоритму ZIP для уменьшения размера файла. Для открытия файла DOCX
в Microsoft Office 2000, Office XP и Office 2003, необходимо установить пакет совместимости Microsoft Office Compatibility
Pack (FileFormatConverters.exe) с официального сайта Microsoft.

Формат XLSX

HEX: 50 4B 03 04

ASCII: PK

Формат PDF

HEX: 25 50 44 46 2D

ASCII: %PDF-

Некоторые практические наблюдения:


Для корректного отображения кириллицы, в текстовом файле (именно том который . txt), его
требуется перекодировать в UTF8 w/o BOM или в любой вариант UTF и только потом загружать в
google drive. Если этого не сделать кириллица превратится в вопросительные знаки.
Если же вы потом этот файл скачаете на другой компьютер то кодировка UTF8 w/o BOM
сохранится.
Если вы поработаете с этим файлом в google document, затем скачаете его как rtf файл, то
кодировка сменится, судя по заголовку файла - {\rtf1\ansi\ansicpg1252\uc0\stshfdb... на ANSI 1252, но
кириллица почему то не повреждается.