Блог

Немного о кодировках

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

Что же подразумевают под этим словом на букву «к» разработчики сайтов? Кодировкой веб-страницы они именуют способ кодирования текстовой информации для её передачи в Интернет. Одним из главных параметров кодирования данных принято считать то количество битов, с помощью которых происходит передача одного символа (или, как его ещё называют, значения). Один бит позволяет передать два значения, два бита — четыре значения, а тремя битами можно передать целых восемь. Путём нехитрых вычислений приходим к выводу – добавление одного бита удваивает количество символов, которые можно закодировать, а это значит, что всего 8 битами кодируются 256 последовательностей двоичных значений, к тому же каждая из таких последовательностей сама способна передать один символ текстовой информации. Ну а кроме 8-битовой, существуют также 16 и 32-битовые кодировки, которые могут обрабатывать 65536 и 4294967296 символов текста соответственно. Теперь, после того как Вы ознакомились с основным параметром, на основе которого выбирается кодировка страницы, и разогрели мозг, перейдём к главному.

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

Во-первых, начать нужно с того, что существует масса различных кодировок. Удостовериться в этом просто: убедитесь, открыв веб-браузер Internet Explorer и выбрав пункт Вид — Кодировка. Из всего списка, открывшегося перед Вашим взором, лишь шесть кодировок, поддерживает кириллицу (то есть русский язык): Windows-1251, KOI-8R, KOI-8U, ISO-8859-5, UTF-8 и русскоязычная Mac-кодировка.

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

Такое количество вариантов кодировки обусловлено исторически. Первой российской кодировкой, получившей широкое распространение, является KOI-8, которую придумали, чтобы адаптировать к русскому языку систему UNIX. Было это давно (аж в 70-х), но в UNIX это до сих пор считается основной кодировкой.

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

В то же время развивались Macintosh-компьютеры, которые также чувствовали потребность в русификации, и поэтому была придумана ещё одна кодировка — MAC.

Затем в 1990 году вместе с первой успешной версией Windows, которая включала поддержку национальных языков, в мир вышла Win-кодировка, ставшая ниболее распространённой на территории России.

Конечно же, предпринимались попытки хоть как-то стандартизировать образовавшуюся сумятицу. И работу по созданию стандарта взяла на себя ISO — международная организация по стандартам. Однако руководители проекта тоже решили отличиться оригинальностью и вместо того, чтобы взять за стандарт какую-нибудь из уже существующих, они придумали новую кодировку — ISO-8859-5. Не сложно догадаться, что и она была мало с чем совместима. Сегодня ISO-8859-5 так и не нашла себе достойного применения, хотя её и поддерживают все современные браузеры.

В общем, как часто это бывает, все проблемы люди создали себе сами. Поэтому со стороны сервера требуется установка системы, которая бы предварительно посылала сообщение, содержащее информацию о том, в какой кодировке будет прислана страница. Браузер же, получив эти данные, должен настраиваться на требуемое отображение. Но и тут всё не так просто. Ошибки в настройке сервера могут привести к тому, что, послав сообщение, где говориться, что сейчас будет страничка в кодировке win-1251, сервер присылает ее в KOI-8. Естественно, что браузер, руководствуясь указаниями сервера, показывает в тоге страницу неправильно.

Но есть способ борьбы и с этой неприятностью. Для этого кодировку указывают не на сервере, а прямо в HTML-коде страницы. Для этого используется метатег, задающий нужный язык.

<meta http-equiv="content-type" content="text/html;charset=тип кодировки">

Но и здесь без подвохов не обошлось. В Рунете очень распространён способ, который включает автоматическое определение кодировки веб-сервером, когда сервер отдаёт страничку клиенту уже перекодированной. В этом случае метатег может всё испортить. Причина тому — приоритет непосредственных указаний на страничке перед командами сервера, то есть веб-сервер не может изменить содержимое тега, а, значит, возможно появление противоречий между кодировками: несовпадение реальной кодировки с указаниями в метатеге. В этом случае нельзя нормально просмотреть содержание страницы и перекодировать её с помощью браузера. Единственный выход в данной ситуации — сохранить страницу и удалить мешающий нормальной работе тег. Отсюда и рекомендации — не применять этот тег вообще. Тогда отображение страниц будет происходить в той кодировке, на которую настроен браузер, если, конечно, сервер не пришлёт свои указания о кодировке документа. Самый простой совет: если по умолчанию выставить кодировку Win-1251, то 95% посетителей увидят страницу в правильной кодировке.

С распространением каскадных таблиц стилей (CSS) в Рунете появилась ещё одна проблема, связанная с кодировками. Дело в том, что CSS предлагает широкий выбор шрифтов для отображения текста на странице. Конечно же, верстальщик может выбрать любой конкретный шрифт, но проблема здесь в том, что при отображении странице на компьютере пользователя шрифты берутся из набора, установленного именно на этом компьютере (на компьютере пользователя). Огромного набора шрифтов там может просто не оказаться (а чаще всего так и бывает). И тогда браузер возьмёт для отображение либо другой шрифт из того же семейства, либо вообще – первое, что попадётся под руку. Избежать этого можно, используя только стандартные шрифты, которые гарантированно находятся на машине клиента ("Arial", "Times New Roman", "Courier"). Или подробнейшим образом описывать шрифт в таблице стилей, перечисляя альтернативные шрифты, которыми мог бы быть заменён выбранный Вами, в случае, если того не окажется на компьютере пользователя. В конце списка должно быть обязательное указание на семейства шрифта (с засечками, без засечек, моноширинный и т.д). Выглядит это так:

<!– –
       .serif { font-family : "Times New Roman","Geneva", "serif"; }
       .sanserif { font-family : "Arial", "Helvetica", "sans-serif"; }
       .mono { font-family : "Courier", "monospace"; }
       – –>

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

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