Кодировки в IRC

Воскресенье, 10 Июнь 2007
Краткий смысл кодировок

Так уж повелось, что компьютер не может запоминать текст в привычном нам понимании. Он запоминает только цифры… Последовательность цифр. Не будем вдаваться в подробности двоичной системы счисления, скажем лишь, что основной единицей информации принято считать байт. Число, записываемое одним байтом, может принимать значение от 0 до 255 включительно.

Для того чтобы сохранить в памяти компьютера текстовую информацию, существуют таблицы кодировок. Они, например, утверждают, что байту со значением 32 соответствует пробел, 21 – восклицательный знак, и так далее. Но символов в различных алфавитах гораздо больше, чем 255 (греческие, русские, латинские буквы, знаки препинания и т.д.). Как же быть в таком случае? Существует два основных решения этой проблемы – использование юникода или различных кодовых страниц.

   Юникод (UNICODE) кодирует каждый символ не одним, а двумя (или более) байтами. Таким образом, он может закодировать до 65536 (2-х байтный юникод) различных символов. Этого достаточно даже для иероглифического письма. Современные кодировки UTF-8, UTF-16 позволяют записывать символы юникода и другим способом, но смысл остается прежним: на один символ отводится более одного байта информации. Юникод стал внедряться совсем недавно, и явился следствием развития компьютерной техники: увеличения объемов хранилищ данных до той степени, когда отведение нескольких байт под один символ не является существенной проблемой.

   Другой выход – использование кодовых страниц. Он следует правилу "1 байт = 1 символ". Существует много способов перекодировки значения байта в соответствующий символ. Таким образом, один и тот же байт, например, со значением 128 может означать совершенно разные символы при использовании различных кодовых страниц.

   Сначала задумывалось, что каждому языку будет назначена своя кодовая страница, но вышло по-другому. Различные разработчики использовали различные способы кодирования символов, и в результате, например в *nix системах сложилась традиция кодировать русский текст в кодировке KOI8-R, в Windows – windows-1251, в DOS – OEM866. Существуют и другие кодировки для русского языка, но не существует универсальной кодировки, понимаемой всеми (без использования юникода).

Появление кодировок в IRC

   В IRC традиционно информация передается в той кодировке, в которой ее отправила пользовательская программа. И поэтому получалось, что пользователь Windows-клиента mIRC отправлял в канал сообщения в cp1251, а *nix пользователь irssi – в KOI8-R. В результате и первый, и второй хорошо видели свои сообщения, но не могли прочесть сообщения собеседника. mIRC до сих пор не имеет встроенной поддержки кодировок, отличных от CP1251 и UTF-8.

   Для решения этой проблемы был создан механизм CODEPAGES. Одной из первых на суд общественности его представила русская сеть WeNet. Она дополнила серверное программное обеспечение Bahamut своими собственными наработками и назвала полученный продукт ircd-ru. Знаковым отличием ircd-ru от bahamut’a стала поддержка сервером различных кодовых страниц.

Решение на серверной стороне

   Как это работает? Для IRC соединения используются различные порты (6667-6672). Windows-клиент подключается к порту 6667, а *nix – к 6670. Второй пишет свои сообщения в KOI8-R, и они автоматически преобразуются сервером в CP1251 и показываются первому, и наоборот. Далее поддержка кодировок была расширена, сделано горячее переключение их. И все бы было хорошо, если бы и тут не началась неразбериха.

Решение на стороне клиента

IRC клиенты X-Chat, IRSSI стали добавлять собственные механизмы работы с другими кодировками, предназначенные для сетей, не поддерживающих этот механизм на серверной стороне. Дальше всех пошел KVIrc, который предоставил возможность отдельно указывать кодировку не только для соединени я, но и для каждого открытого окна канала, личной беседы, DCC чата и т.д. И получилось «как всегда». Люди стали путаться в кодировках, для них стали писать руководства по использованию и настройке, что привело к устоявшемуся мнению «IRC – это сложно». Многие сети и вовсе решили, что работающее в mIRC – хорошо, а остальные приспособятся. Другие начали создавать свои механизмы перекодировок, не совместимые друг с другом (на одних и тех же портах разных сетей используются разные кодировки), что только усугубило ситуацию.

Взаимодействие клиента и сервера

   Как же быть? Ведь хотели-то как лучше? Из крупнейших русских сетей две – WeNet и RusNet пришли к следующему решению: при подключении клиента, ему отправляется сервером служебное сообщение, которое говорит, в какой кодировке нужно работать с сервером на данном порту. KVIrc давно имеет поддержку этой возможности для сети WeNet и в новой версии обзаводится ею для сети RusNet. Но это единственный IRC клиент, который вообще задумывается над этой проблемой. А т.к. аудитория KVIrc не так многочисленна, как у mIRC, он не может существенно повлиять на ситуацию.

   Так, например, сеть TurliNet вместо стандартного сообщения о кодировке, которое возможно воспринять IRC клиенту, отправляет текстовое сообщение вида «Your codepage is now CP1251». Мол «сам прочитай и настрой». ForestNet, DalNet (ru) не утруждает себя отправкой даже этого. Мол «читайте MOTD, там все есть». Администрация TurliNet и ForestNet в (местами неприлично) грубой форме отказала в просьбе исправить или добавить это сообщение, даже если будет предоставлен готовый патч. Основные мотивы – «в mIRC и так работает» и «обновить ПО в целой сети нелегко». Однако же, стоит заметить, что и в RusNet это сообщение существовало в виде, аналогичном TurliNet-овскому всего несколько месяцев назад, но, по-видимому, администрация решила, что удобство пользователя все же важней их нежелания что-то делать и добавила по нашей просьбе эту функциональность.

   Что будет? Никто не скажет ответа на этот вопрос. Можно лишь с уверенностью сказать, что актуальность сохраняется. Пусть и не огромной, но сохраняется. И неразбериха в IRC, нежелание предоставить UTF-8 кодировку, не способствует улучшению ситуации. Идеальным решением – было бы введение стандартизованного механизма перекодировок и поддержка UTF-8. Наиболее близок к этому сейчас RusNet.

Последнее обновление ( Среда, 25 Июль 2007 )
< Пред.   След. >