Передовая Каталог девелоперских компаний Обсуждение горячих вопросов Персональные дневники Интересные тексты Центр управления


Charset умер. Да здравствует Charset!

::: Автор: Юрий Колоколов
::: Категория: HTML
::: Обсудить cтатью на форумах



Как "убивали" Charset

  В темной комнате, с мышью оставшись вдвоем,
Хитрый пес объявил: "Мы судиться пойдем!
Я скучаю сегодня: чем время занять?
Так пойдем же: Я буду тебя обвинять!"
"Без присяжных, - воскликнула мышь, - без судьи!
Кто же взвесит тогда оправданья мои?"
"И судью, и присяжных я сам заменю", -
Хитрый пес объявил. - "И тебя я казню!"

Л. Кэрролл "Алиса в стране чудес"

Обратимся к истории. Те, кому история хорошо знакома, могут этот раздел пропустить без всякого сожаления.

Несколько лет назад могучая и влиятельная организация разработала массу стандартов и рекомендаций, которые каждый интересующийся может прочитать на всемирно известном www.w3.org. Обязательная структура HTML-документа, согласно стандарту, включает в себя раздел HEAD, который предназначен для указания всевозможных сведений о структуре, происхождении, статусе и прочих характеристиках документа. Один из рекомендованных атрибутов - Charset. Он предназначался для указания набора символов, который использовался для написания этого документа.

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

Шло время. Российская часть Интернета все расширялась, и детские болезни сменились болезнями переходного периода. Переходный возраст, как известно, не знает компромиссных решений. Долгие колебания и спокойный расчет ему также не свойственны. Оправдывая свой возраст, российский Интернет принялся неистово и беспощадно сражаться со всем, что казалось ему неправильным, сильно напоминая при этом незабвенного героя Сервантеса, что бросался на ветряные мельницы. Для описания любой возникшей проблемы ему достаточно было всего двух слов: "ура" или "долой". Долой фреймы, долой фоновый MIDI, долой еще много чего. Как и следовало ожидать, только половина проблем стоила такой категоричности, но что поделаешь - переходный возраст.

И вот - пару лет назад авангард российского Интернета бросил клич: "Долой Charset!" Клич, как всегда, был категоричным и безапелляционным. Но это уже никого не удивило - кто не с нами, тот против нас!

Аргументы у противников невинно убиенного Charset'а, разумеется были, и аргументы, надо признать, очень убедительные. Прежде чем разбираться в проблеме по существу, нелишне будет их вспомнить.

Самым важным и существенным аргументом было горячо любимое российской публикой серверное ПО, что известно под именем "Russian Apache". К нашей теме этот факт имеет самое прямое отношение, так как в составе "Апача" появились средства автоматической перекодировки документов. Сделано, разумеется, это было из благих намерений. Можно долго спорить о том, нужно ли было это делать (и найти немало аргументов против), но - после драки кулаками не машут. Важнее не то, что было сделано, а то, как именно это было сделано. Краткий ответ: из рук вон плохо. Оказывается, что программа, способная перекодировать документы в любую кодировку, неспособна справиться с маленькой дополнительной задачей - соответствующим образом исправить и Charset в заголовке HTML-документа.

Результат оказался плачевным. Горе от серверного "ума" реализовалось в виде неправильно указанной кодировки в документе, который приходил к пользователю. Например: пользователь, у которого по умолчанию в броузере указана кодовая страница КОИ8, обращался на "умный" сервер, на котором все документы "лежат" в кодировке Win-1251, получал документ, который сервер заботливо перекодировал в КОИ8, но с сохранением строки Charset=Win-1251, если она, конечно, вообще была указана явно. Поскольку исправлять ПО было лень, да и поздно, виновным объявили Charset.

Были у антагонистов и другие аргументы. Часто назывались: увеличение размеров документов, трудности индексации поисковыми системами, ошибки при описании Charset и кое-что другое. Время от времени всплывали и не названные здесь причины, но они были менее значительны, и за давностью давно уже забыты.

Вина Charset'а казалась бесспорной, и на пощаду надеяться не приходилось. Суд был скорым на расправу. А кто же судьи?

Кто и почему "убивал" Charset

  Ему казалось - на трубе
Увидел он Слона.
Он посмотрел - то был Чепец,
Что вышила жена.
И он сказал: "Я в первый раз
Узнал, как жизнь сложна"

Л. Кэрролл "Сильви и Бруно"

Кто же эти могучие люди, что обрекли на жалкое существование злополучный атрибут? Жадные злодеи и беспощадные супостаты?

Нет. Это очень уважаемые люди: некоторые из ведущих российских веб-дизайнеров. Так что подозревать их в дурных намерениях не приходится. Они кровно заинтересованы в хорошем качестве наполнения российской Сети.

Что же помешало им разобраться в проблеме по существу и подтолкнуло к скоропалительным решениям?

Каждый мнит себя стратегом, видя бой со стороны. Сделаем же то, что гранды российского дизайна сделать позабыли: постараемся рассмотреть проблему всесторонне.

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

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

Даже очень хорошие дизайнеры - это всего лишь дизайнеры. Они озабочены прежде всего текущем положением дел. Их хочется, чтобы их проекты реализовывались с максимальной легкостью и изяществом. Им хочется, чтобы сайты было удобно создавать и обновлять, чтобы возможно большая часть работы была автоматизирована. И совсем не хочется соблюдать какие-то глупые стандарты (не относящиеся к дизайну), которые сковывают их творческие помыслы. Их мало заботит общая доступность текстов и функциональность текстовых ресурсов вообще. Специалист подобен флюсу. Дизайнеров волнует то самое usability, о которым они так охотно распространяются. К пользователю приходит документ с неправильно указанной кодировкой? Да это же нарушение базовых принципов! Пользователю неудобно! Charset виноват? Долой Charset!

Но беда в том что дизайнер думает о пользователе - человеке, посетителе их сайтов. А разработчики стандартов заботились о Пользователе - некотором обобщенном субъекте, собирательном образе людей из разных стран, с разным уровнем образования, здоровых и инвалидов, нынешних и будущих, умных и глупых. И то, что хорошо пользователю, плохо Пользователю. Потребности первых лежат в гораздо более узких пределах. Эти люди не желают иметь ни одной лишней проблемы, и имеют на это право. Но с точки зрения вторых, лучше доставить небольшие неудобства каждому, нежели большие - многим. Стандарты по возможности учитывают все потребности всех пользователей, а для этого приходится идти на некоторые жертвы.

Разработчики стандартов, безусловно, прогнозируя и появление "умных серверов", и появление многого из того, о чем мы еще и не догадываемся, все-таки пришли к выводу что указывать набор символов необходимо. Значит - у них были на то веские причины.

Дизайнеры подробно описали нам, какие проблемы вызывает указание Charset'а. Скажем им спасибо: кто предупрежден, тот вооружен. Проблемы серьезные, но не такие уж и страшные. Но дизайнеры и не подумали рассказать нам о проблемах, которые вызывает неуказание Charset'а! Попробуем же восполнить эту досадную нехватку.

А чем это плохо

  Мне не стало хватать его только сейчас,
Когда он не вернулся их боя

В. Высоцкий

Представим себе такую ситуацию: посетитель загрузил страницу с сайта, и увидел набор непонятных символов. Он перепробовал несколько кодировок, но добился только того, что один бессмысленный набор сменялся другим - столь же бессмысленным. Причина в том, что Charset не был указан.

А какая кодировка у документа, в котором не указан Charset? Да, собственно говоря, никакая. Она - неизвестна! Установить ее можно только смысловым анализом, а для этого нужно обладать знанием языка и некоторым навыками криптологии.

На тех же самых позициях, на которых в русских кодировках расположены русские буквы, в других национальных кодировках расположены другие символы. А теперь попробуем представить HTML-документ, который написан не на русском языке и без указания Charset'а "положен" на "умный" сервер. Что-то будет после того, как сервер его "обработает"!

Итак, у нас уже есть первый вывод: без указания Charset'а невозможна корректная работа с иноязычными документами (за исключением написанных на английском или латинском языках).

Можно возразить, что для русских сайтов это не важно. Но так ли это? В России, к счастью, еще немало людей, владеющих несколькими иностранными языками, У нас еще сохранились остатки не имеющей себе равных в мире плеяды переводчиков. Следовательно - на русских сайтах будет все больше и больше документов на самых разных языках. Правда, для большинства европейских языков можно указывать коды символов, или специальные последовательности вроде &Euml, но это не выход.

Несколько усложним задачу. У великолепного советского переводчика и литератора К. Чуковского есть книга, которая называется "Высокое искусство". Она посвящена искусству художественного перевода. Страницы этой книги полны примеров на самых разных языках, хотя преобладают, разумеется, примеры на русском. То есть - предназначена книга для русскоязычного читателя.

Что должен делать человек, который пожелает "выложить" ее текст на сайте? Можно разместить маленькие фрагменты текста на разных языках в разных документах. Едва ли это будет хорошим решением, так как примеры, как правило, коротки.

Само собою напрашивается применение Unicode. И можно сделать еще один вывод: без указания Charset'а нет никакого смысла пользоваться Unicode (кодировки UTF-7 и UTF-8), так как у броузера нет никакого верного способа определить использование этого стандарта. Конечно, пользователь может сам указать эту кодировку, но тогда получится: за что боролись, на то и напоролись. Ведь автоматическая перекодировка предназначалась именно для того, чтобы избавить пользователя от мук выбора.

Представим себе еще и третью ситуацию. Допустим, что пользователь, не удовлетворившись возможностями печати броузера, решил распечатать документ в редакторе текстов. Но как редактор определит набор символов, которые нужно применить для документа? У него ведь нет возможностей броузера, да и связаться с сервером, возможно, уже нельзя. Конечно, хороший редактор попробует применить набор символов по умолчанию, наиболее типичный набор. Но если у данного документа другая кодировка? Скорее всего, - редактор предложит пользователю определить кодировку самостоятельно. Но ведь не каждый пользователь "подкован" в этом вопросе. Наш третий вывод: отсутствие Charset'а затрудняет просмотр и редактирование документа нетрадиционными средствами.

Можно привести еще ряд доводов, которые - для экономии времени - мы не будем рассматривать подробно.

1. Отсутствие Charset'а затрудняет работу с текстом для тех, кто не владеет данным языком. Не всегда HTML-документы загружаются с целью немедленного прочтения. Иногда человеку, не владеющему языком документа, нужно всего лишь распечатать его для другого лица. Несомненно, отсутствие Charset'а поставит его в сложное положение.

2. Отсутствие Charset'а затрудняет автоматизированную обработку документов. Например, для сбора некоторой статистики, для пополнения каталогов и баз поисковых систем. Со временем, несомненно, появятся и многоязычные поисковые системы и каталоги, которые будут нуждаться в явном указании языка документа. Без этого корректная работа будет невозможна. Возможно, этот атрибут будет также использоваться для фильтрации.

3. Будущие разработчики броузеров могут внести некоторые коррективы в поведение своих произведений. Намного больше вероятность того, что они будут руководствоваться при этом общими рекомендациями, а не российскими "перегибами".

Виновен ли Charset

  …Ах, чем я виноват? - Молчи, устал я слушать,
Досуг мне разбирать вины твои, щенок!
Ты виноват уж тем, что хочется мне кушать…

И. Крылов "Волк и ягненок"

Вернемся к обвинениям, которые были предъявлены герою этой статьи. Вот как звучит наиболее типичное обвинение, звучащее со множества дизайнерских сайтов: "нет никакого смысла указывать Charset, так как выдаваемая сервером кодировка - непостоянная". О том что смысл есть (хотя бы иногда) уже было сказано. Займемся теперь самой постановкой заявления, не касаясь его истинности.

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

Виноват не Charset, а неразумное его использование. Виноваты те самые "умные" сервера, точнее - их разработчики. Стоило добавить небольшую процедуру, которая корректировала бы Charset, и проблема бы не возникла. К сожалению, этого не случилось.

Если человек, который "выкладывает" документ на сервер, боится указать его Charset по причине, что сервер его якобы может испортить, из этого можно сделать только один вывод: этот человек не знает, что делает с документами его сервер! Вдумается в эту ситуацию: владелец сайта не знает, как обрабатываются документы на его сайте!

А это знать необходимо! Ведь сервер может не только перекодировать документы. Можно придумать еще множество функций, приводящих к изменению документа. Например - выдавать автореферат документа. Для многих сайтов это было бы полезно. Или автоматический перевод на другие языки. Как же владелец может допустить свою непросвещенность в этом вопросе?

Между тем - так ли сложно преодолеть эту проблему? Скорее всего - нет. Все, что для этого нужно - полная информация о возможностях сервера. Тот, кто ею владеет, сможет предусмотреть все возможные варианты.

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

А теперь остается развеять миф о вредности указания Charset'а для самого броузера: он-де не сможет изменить кодировку, будет тупо следовать указанному. Задумаемся: отчего это? Оттого, что указан Charset? Нет - оттого, что он указан неверно! Нет и не может быть ничего плохого оттого, что Charset в заголовке документа, пришедшего к пользователю, будет соответствовать реальному набору символов в теле документа.

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

Стоит ли соблюдать стандарты

  Я вывихнул ногу и слышу упрек
Отца, что пришел на подмогу:
"когда бы ты шел по дороге, сынок,
тогда бы не вывихнул ногу"

Р. Гамзатов

Все мы очень не любим, когда нас в чем либо ограничивают. Всех "достали" доблестные сотрудники ГИБДД, которые любят поставить на скоростном участке знак "60" и притаиться неподалеку, предвкушая мзду. Едва ли кто-то рад тому, что нужно платить налоги. Говоря короче - всевозможные правила досаждают.

Но задумаемся на минуту - что будет, если с дороги убрать все ненавистные ограничительные знаки (вместе с ГИБДДшниками)? Если дорога широкая и машин мало - ничего. Но через несколько дней на этом участке, почувствовав свободу, уже будут вовсю сбивать столбы и пешеходов пьяные водители, и вскоре из-за покореженных кузовов общая скорость станет гораздо меньше той, что устанавливали ограничительные знаки вкупе с людьми в сизой одежде.

Свобода - это осознанная необходимость.

Любой стандарт доставляет неудобства, но окупает их благами, которые дает его применение.

Что бы сказал водитель дизайнеру, который придумает исключительно элегантные и удобные органы управления автомобилем, которые кардинально отличаются от руля, педалей и рычагов? Скажем - для поворотов будет предложено перемещать ту часть тела, на которой принято сидеть, а тормоза задействовать путем кивков головой?

Скорее всего - ничего хорошего. Какими бы удобными не были нововведения - они нестандартны, а значит - все равно неудобны. Другое дело - если они смогут стать стандартными. Но для этого нужно:

1. чтобы преимущества новинок были реальными для подавляющего большинства, а не для некоторой части;

2. чтобы функциональность сохранилась на прежнем уровне.

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

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

Можно сказать, что отсутствие Charset'а стало в российской Сети фактическим неписаным стандартом. Однако - это победа ограничена во времени и пространстве. Мы нарушаем правила, когда нам это выгодно, а наказание не слишком реально. Но со временем выгода от неуказания Charset'а будет лишь более сомнительной (она не может стать большей), а наказание (неудобства) станут более ощутимым.

Где же выход?

  - Идем скорей, идем! Уж мне не ждется!
- Потише: Кто торопится - споткнется.

Шекспир "Ромео и Джульетта"

Помните ли - в древности был такой добрый разбойник Прокруст. Он тоже пытался решить проблему стандартов способом, подобным тому, каким была "решена" проблема кодировок.

Попробуем действовать немного аккуратнее Прокруста, и рассмотрим ситуацию, возникающую при автоматической перекодировке документа. Применим к этой ситуации самый банальный анализ:

Имеем:
Вариант 1. В документе указана кодировка.
Вариант 2. В документе не указана кодировка.

Сервер, очевидно, может помочь только в первом случае, так как во втором кодировка НЕИЗВЕСТНА. Она совсем не обязательно русская. Своим вмешательством сервер может только испортить документ.

Вариант 1. Пользователь просит эту же кодировку
Вариант 2. Пользователь просит другую кодировку

В случае 1-1 вмешательства сервера не требуется.
В случае 1-2 вновь имеем два варианта:

Вариант 1. Сервер "знает" как полностью корректно перевести эту кодировку в нужную
Вариант 2. Сервер этого "не знает"

Вариант 1-2-1 не вызывает никаких проблем. Нужно перевести документ ВМЕСТЕ с кодировкой.
Вариант 1-2-2 аналогичен варианту 2. Сервер не сможет корректно перекодировать документ, и ему лучше оставить все как есть.

Большинство случаев будет относится к варианту 1-2-1, который не вызывает затруднений. Остается еще вариант, при котором автор документа указал неправильный Charset, но это лучше оставить на его совести.

Но кроме всего этого, есть кодировки которые вообще нельзя перевести. В какую кодировку, например, можно перекодировать UTF?

Комментарий профессора Преображенского: "... следовательно, разруха не в сортирах, а в головах. ... и когда он вместо этого займется своим прямым делом - чисткой сараев - разруха исчезнет сама собой...".

Если бы не было таких "интеллектуальных" серверов, все возможные варианты перекодировки для русского языка свелись бы всего к 30 случаям. Это легко можно решить на машине пользователя. Но такие сервера уже есть, и имеют право на существование. Следовательно - надо не воевать с Charset'ом, а ликвидировать разруху на сервере. То есть упорядочить правила.

Вот возможный вариант:

1. Владельцы сервера выбирают "основную" кодировку и рекомендуют присылать файлы именно в ней. Можно также считать, что если кодировка не указана, она принимается по умолчанию.

2. Владельцы сервера четко описывают, в какие кодировки их сервер может привести основную. Лучше, если логика процедуры перекодировки будет описана полностью.

3. Если автор все-таки использует другую (незнакомую) кодировку, нужно оставить ее такой, какая она есть.

4. Можно предупреждать автора о том, что кодировка нестандартная.

В этом случае подавляющее большинство проблем будет решено.

Возможен и другой, "почти идеальный" вариант.

На входе:
1. Все поступающие документы преобразуются в UTF (поскольку в нее можно перевести все прочие Charset) с одновременным исключением Charset'a. Можно одновременно строить некоторую служебную информацию, в которой обозначались бы диапазоны употребленных символов.
2. Если кодировка незнакомая, Charset оставляется нетронутым, и файл не перекодируется.

На выходе:
1. Если у документа есть Charset, документ передается в неизменном виде.
2. Если Charset'а нет, это будет означать, что документ в стандарте UTF.
3. По запрошенному пользователем Charset'у определяется набор символов, которые пользователь может принять. Если он может принять все символы, то документ просто перекодируется.
4. Если пользователь может принять не все символы, можно предпринять дополнительные действия: либо перекодировать прочие символы в близкие по начертанию латинские (если это возможно), либо спросить у пользователя, что он хочет: перекодировку с потерей надстрочных знаков, либо пусть переключает свой Charset.
5. Если документ содержит символы, которые неизвестны пользователю (корейские, арабские и т.п.), и не имеют близких аналогов в латинице - предпринять еще какие-либо действия.

Но конечно, этот вариант требует больших ресурсов и в настоящий момент, скорее всего, нереален.

Подводим итоги

  Мольба, душевное смиренье
Рождает в судьях снисхожденье.
Все грешны, все прощенья ждут.
Да будет милостив ваш суд.

Шекспир "Буря"

В самом деле - пора подводить итоги. Большинство статей, "разносящих" Charset - гораздо короче.

Ситуация с Charset'ом, которая сложилась в настоящее время, совершенно ненормальна. Он стал жертвой борьбы с проблемой, которая была порождена не им, и даже - более того - она не имеет к безобидному атрибуту прямого отношения.

Однако, еще классики учили нас отделять базис от надстройки, а существующий строй объясняли производственными отношениями. Нечто подомное придется сделать и в нашей ситуации.

Надо признать, что большинство авторов не терпят практически никаких неудобств, размещая свои страницы на серверах с "кривой" автоматической перекодировкой, либо не замечают этих проблем по техническим или иным причинам. Это, разумеется, при том условии, что они следуют рекомендованной для своего сервера процедуре размещения документов.

Множество авторитетов от дизайна вполне удовлетворены такой ситуацией, существующая практика кажется им наиболее удобной, и отказываться от нее они не собираются.

Что-то подобное наблюдалось в начале восьмидесятых годов с эпидемией СПИДа. Число больных было слишком мало, чтобы всерьез волновать "широкие слои общественности". К чему это привело - известно всем.

С Charset'ом, скорее всего, произойдет что-то подобное. В случае со СПИДом обозначились "группы риска", которым профилактика была необходима в первую очередь. Такие же группы неизбежно сформируются и в нашем случае. В первую очередь это те, кому недостаточно одного лишь русского языка, и одной лишь страны России.

Первым этапом борьбы со СПИДом, почти уже завершившимся этапом, стало преодоления нетерпимости общества, которое поначалу было готово чуть ли не расстреливать каждого больного. Это верно и в нашем случае. Пока "виновника" предпочитают расстреливать. Но постепенно все большее и большее количество людей станут понимать, что сама проблема от этого никуда не денется. Рано или поздно придется ее решать нормальным путем, а не создавать видимость решения быстрым и простым путем.

Пока же - все по большей части останется как есть. Подросток - российский Интернет - еще не вырос, назойливых проблем он замечать не желает, и ошибаться ему придется еще не один, и даже не сто один раз. Лекарство одно - время. Оно все расставит по местам.

Очень легко представить себе кислые усталые усмешки противников Charset'а: "Ну вот, опять о том же! Что тут обсуждать? Ведь все уже было сказано!" Нет, уважаемые господа, далеко не все. Однако копья ломать сейчас действительно незачем. Жизнь нас рассудит.



::: Обсудить cтатью на форумах
Меню

» Статьи
» Интервью
» Исследования
» Фотоальбом

» Архив новостей (до 2001)

Ссылки от спонсоров



Категории статей

» Девелопмент {5}
» Дизайн {1}
» Flash {1}
» HTML {1}
» Контент {2}

» Креатив {1}
» Реклама {3}

» Разное {1}


Copyright © Агентство «Эпоха», Сергей Смирнов.