Управление кодировкой текстовых файлов
Чтобы обеспечить возможность взаимодействия различных аппаратно-программных платформ, SGML требует, чтобы каждое приложение (включая HTML) явным образом указывало используемый в нем набор символов документа – document character set. Любой набор символов характеризуется двумя составляющими: репертуаром (Repertoire) и способом кодирования позиции (Code positions).
Репертуар – это набор абстрактных символов, используемых для записи слов и выражений на соответствующем языке (например, в репертуар могут входить латинский символ "А", кириллический символ "Ы", китайский иероглиф, означающий "воду", и т. д.).
Способ кодирования позиции – это набор целочисленных ссылок на символы, входящие в репертуар. Например, компьютерные системы опознают каждый символ по его числовому коду; так, в наборе символов ASCII коды 65. 66, и 67 ссылаются на символы "А", "В" и "С" соответственно.
В настоящее время существует достаточно большое число различных способов кодирования текстовой информации. Некоторые из них возникли значительно раньше Интернета, были стандартизованы и продолжают использоваться в локальных вычислительных системах. Другие же были разработаны специально для обмена данными через Сеть.
Наиболее известным представителем первой группы является код ASCII (American Standard Code for Information Interchange – стандартный американский код для обмена информацией). В нем для кодирования каждого символа используется 7 двоичных разрядов. Набор символов ASCII обеспечивает представление всего лишь 127 различных символов (около 30 служебных, десятичные цифры, буквы английского алфавита и символы пунктуации). Модификацией кода ASCII является так называемый ANSI-код (код, разработанный Американским национальным институтом стандартов – American National Standard Institute), в котором для кодирования каждого символа используется 8 двоичных разрядов, что обеспечивает представление уже 256 символов. Особенностью ANSI-кода является то, что первые 127 символов он "унаследовал" от ASCII (поскольку они стандартизованы), а вторая половина кода (точнее, половина соответствующей кодовой таблицы) используется в разных странах и разными разработчиками по-своему. Например, в СССР эта часть кодовой таблицы была использована для кодирования символов кириллицы.
На сегодняшний день наиболее распространенным вариантом ANSI-кода (в том числе в Интернете) является так называемая "Латиница" (Latin-1) – код, регламентированный международным стандартом ISO-8859-1. Этот код поддерживает практически все западноевропейские языки. Кроме него, в Сети (по крайней мере, в русскоязычной ее части) также достаточно широко применяются следующие ANSI-коды:
- ISO-8859-5 – содержит символы кириллицы и применяется в вычислительных системах, работающих под управлением операционных систем Unix и Sun Solaris;
- Windows-1251 – содержит символы кириллицы и применяется в вычислительных системах, работающих под управлением операционных систем семейства Windows.
Коды ASCII и ANSI зачастую оказываются недостаточны для глобальной информационной системы типа Интернета, поскольку ни один из них не обладает требуемой "многоязычностью". Поэтому HTML использует более совершенный набор символов, который называется Универсальный набор символов (Universal Character Set – UCS). Параметры этого, кода определены в стандарте ISO-10646. Он обеспечивает использование набора из нескольких тысяч символов, позволяющих представить символы, используемые практически во всех языках (в том числе и в профессиональных, например, в математике). Такое количество представимых символов объясняется тем, что код UCS является двухбайтовым, то есть для кодирования символов в нем используются 16 разрядов.
Набор символов, определенный в ISO-10646, эквивалентен используемому в другом двухбайтовом коде – Unicode. Оба эти стандарта пополняются время от времени новыми символами, и относительно принятых изменений следует консультироваться на соответствующих информационных узлах Сети.
Огромное количество символов, представимых с помощью двухбайтовых кодов, не позволяет применять для этих кодов простейший алгоритм кодирования, основанный на методике "один байт – один символ". В некоторых случаях с целью упрощения алгоритмов кодирования и сокращения затрат времени и памяти на храпение кодовой таблицы вместо полной версии кода UCS используются его подмножества. Один из таких "частичных" кодов – код UTF-8 (UCS Transformation Format), в котором число байтов, используемых для кодирования символа, зависит от вида символа: для первых 256 символов используется 1 байт, а для "старших" символов – 2 банта.
Сам по себе набор символов документа не позволяет средствам просмотра пользователя (браузеру) правильно интерпретировать документы HTML, поскольку они обычно пересылаются по сети в виде последовательности байтов. Соответственно, для пересылки документа должно быть предварительно выполнено преобразование его символов (character encoding).
Средства разработки (например, текстовые редакторы) могут использовать различные методы кодирования документов HTML (то есть способы преобразования символов в последовательность байтов), и выбор метода в значительной степени зависит от соглашений, используемых системным программным обеспечением компьютера, на котором создавался документ. Кроме того, не всегда для всех символов документа применяется один и тот же способ кодирования.
В силу указанных причин браузер должен знать конкретный способ кодирования символов, который использовался для преобразования последовательности символов документа в поток байтов.
Каким образом браузер может получить сведения об используемом в документе способе кодирования? Основных механизмов три:
- указания от Wеb-сервсра, выполняющего пересылку документа (соответствующая информация содержится в параметре "charset" поля "Content-Type" заголовка HTTP-протокола);
- тег <МЕТА> с атрибутом HTTP-EQUIV, содержащийся в заголовке документа;
- использование атрибута CHARSET в теге <А> для элементов документа, ссылающегося на внешний ресурс.
Замечание
Если ни один из этих механизмов не используется, то браузер по умолчанию пытается интерпретировать кодировку документа как ISO-8859-1.