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

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

Однако торжество современных технологий — явление относительно новое. Согласно Google, самой распространенной в интернете кодировкой UTF-8 стала только в 2008 году — тогда ее использовали чуть более чем 25% проиндексированных веб-страниц. А еще в 2006 UTF-8 использовали менее чем 10% веб-страниц.

График изменения популярности кодировок в интернете.

Стремительный рост популярности кодировки UTF-8 связан с целым рядом ее преимуществ перед предшественницами. Но чтобы действительно понять и оценить эти преимущества — нужно немного изучить историю вопроса.

ASCII

А начнем мы с возникновения кодировки ASCII, которую в середине двухтысячных и начала вытеснять собой из интернета кодировка UTF-8.

ASCII (англ. American Standard Code for Information Interchange) — американская стандартная кодировочная таблица для печатных символов и некоторых специальных кодов. В американском варианте английского языка произносится [э́ски], тогда как в Великобритании чаще произносится [а́ски]; по-русски произносится также [а́ски] или [аски́].

Статья об ASCII на Википедии

Кодировка ASCII была разработана в 1963 году Американской Ассоциацией Стандартов (которая позже стала Американским Национальным Институтом Стандартов — ANSI), впоследствии несколько раз обновлялась — в 1967 и 1986 годах. ASCII — 7-битная кодировка, включающая в себя 128 символов: 33 непечатных управляющих символа (влияющих на обработку текста и пробелов) и 95 печатных символов, включая цифры, буквы латинского алфавита в строчном и прописном вариантах и ряд пунктуационных символов.

Таблица кодов символов в ASCII.

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

ISO/IEC 646

По этой причине в 1972 году началась разработка группы кодировок, основанных на ASCII, где редко используемые символы из ASCII заменялись на необходимые. Группа включала в себя варианты кодировки для Канады, Китая, Кубы, Германии, Дании, Финляндии, Франции, Великобритании, Греции, Венгрии, Ирландии, Японии, Южной Кореи, Мальты, Норвегии, Швеции и Югославии.

Стандартизация кодировок группы позволила свести различия между кодировками разных стран к минимуму.

KOI8

Естественно, СССР не остался в стороне, разработав в 1974 году свою кодировку — KOI8 (Код Обмена Информацией, 8 бит). Как следует из названия, это была 8-битная кодировка, что позволяло включить в нее в два раза больше символов. KOI8 включала в себя цифры, буквы латинского и русского алфавита, а также знаки пунктуации, спецсимволы и псевдографику.

Таблица кодов символов в KOI8-R.

Эта кодировка существует в нескольких вариантах для разных кириллических алфавитов, в частности: KOI8-R — для русского алфавита, и KOI8-U — для украинского. Кодировки KOI8 стали одними из самых популярных в русском сегменте интернет до распространения UTF-8.

ISO/IEC 8859

Ранние кодировки были ограничены 7 битами из-за особенностей некоторых протоколов передачи данных. Однако со временем эти ограничения свою актуальность потеряли, в то время как необходимость в дополнительных символах для языков, использующих латинский алфавит, только росла. Поэтому в середине 80-х началась работа над группой 8-битных кодировок, получившей название ISO/IEC 8859. Все кодировки этой группы были основаны на ASCII. Помимо расширения диапазона доступных символов за счет восьмого бита, на печатные символы была заменена часть устаревших к тому моменту непечатных управляющих символов.

Здесь стоит отметить две кодировки из группы. Первая — ISO-8859-1 — была опубликована в 1987 году. Она включала в себя так называемый «Латинский алфавит номер 1» (сокращенно Latin-1), состоящий из 191 символа латинского письма. Этот набор символов используется по всей Северной и Южной Америке, в Западной Европе, Океании и на большей части Африки. Кодировка ISO-8859-1 стала основой для наиболее популярных 8-битных кодировок.

В 1988 году была опубликована ISO-8859-5. Она была создана для работы с кириллическими языками. Включенные в эту кодировку символы обеспечивали полную поддержку русского, белорусского, болгарского, сербского и македонского языков. А вот для полной поддержки украинского языка ей не хватало буквы «ґ». Особого распространения эта кодировка не получила, но интересен сам факт разработки кириллической кодировки в рамках группы кодировок ISO/IEC.

Windows-125x

В начале 90-х годов компания Microsoft разработала группу кодировок для ОС Windows. Среди прочих хочется отметить две кодировки: Windows-1251 и Windows-1252.

Windows-1251 была разработана на базе «самодельных» кодировок для русификаторов Windows при участии российской компании-разработчика ПО «ПараГраф» и СП «Диалог» — совместного советско-американского предприятия в области вычислительной техники. В эту кодировку вошли все символы русского и близких к нему языков: украинского, белорусского, болгарского, сербского и македонского. На практике этого оказалось достаточно, чтобы кодировка Windows-1251 закрепилась в интернете вплоть до распространения UTF-8.

Таблица кодов символов в Windows-1251.

Windows-1252 была разработана на основе кодировки ISO-8859-1 путем замены ряда непечатных контрольных символов на печатные (в частности, символ евро, ряд пунктуационных и несколько других символов). Сходство этих двух кодировок часто приводило к неверному отображению текста, когда вместо новых символов из Windows-1252 отображались знаки вопроса. Эта ситуация была настолько частой, что многие почтовые клиенты для отображения писем кодировки ISO-8859-1 стали использовать Windows-1252. В конечном итоге такое поведение было внесено в спецификацию HTML 5 в качестве требования.

Переходный период

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

Интересно, что в KOI8-R русский алфавит был расположен не в алфавитном порядке: позиции символов русского алфавита соответствовали их фонетическим аналогам в английском алфавите. Таким образом, при интерпретации кодировки текста как 7-битной, русский текст превращался в некое подобие транслита. Например, слова «Русский Текст» превратились бы в «rUSSKIJ tEKST».

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

UTF-8

Впервые кодировка UTF-8 была официально представлена на конференции USENIX в Сан Диего в январе 1993. От других мультибайтных кодировок ее отличала полная совместимость с ASCII: все символы ASCII в UTF-8 кодируются 7 битами. Каждый символ кодировки, отличный от ASCII, состоит из ведущего байта, указывающего длину последовательности, и одного или нескольких продолжающих байт. Такой принцип позволяет определить длину последовательности только по первому байту. Коды символов ASCII, ведущих и продолжающих байт не пересекаются, что позволяет легко найти начало последовательности простым откатом назад максимум на пять байт.

В ноябре 2003 года стандартом RFC-3629 максимальная длина последовательности UTF-8 была ограничена четырьмя байтами, однако потенциально UTF-8 позволяет использовать последовательности вплоть до шести байт.

Принцип кодирования

У всех однобайтных символов старший бит кода установлен в 0 и полностью совпадает с кодом символа в ASCII:

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

Такой подход создает несколько символьных диапазонов разной величины. Первый диапазон использует 7 бит и кодирует до 128 символов. Второй диапазон использует 11 бит и кодирует до 2 048 символов. Третий и четвертый диапазоны используют 16 бит и 21 бит соответственно и позволяют кодировать до 65 536 и 2 097 152 соответственно. В сумме все четыре диапазона значений позволяют кодировать до 2 164 864 символов.

 

Кодировка UTF-8 является универсальной и имеет внушительный резерв на будущее. Это делает ее наиболее удобной кодировкой для использования в интернете.