АВТОМАТИЧЕСКОЕ ИСПРАВЛЕНИЕ ОШИБОЧНОЙ КОДИРОВКИ РУССКОГО ТЕКСТА

С.В.Знаменский

Институт программных систем РАН, Переславль-Залесский

Тел.: (08535) 98-005, 98-964, e-mail: znamensk@rustex.botik.ru

Традиционно существующие различные кодировки русского текста в различных операционных системах создают немалые трудности при обмене информацией по сети.

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

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

В этом отношении показателен широко распространившийся последнее время алгоритм автоматичекого определения кодировки входного файла, основанный на подсчете статистики частот содержащихся в нем русских букв и сравнении ее с посчитанной для "эталонного" текстового файла на русском языке. Этот алгоритм блестяще реализован, например, в популярной программе Е.Рошаля FAR управления файлами под Windows 95. Он абсолютно правильно определяет кодировку достаточно длинного русского текста (как правило одной строки букв в 30-60 уже вполне достаточно). Однако, фраза в koi8 "Я ЛЮБЛЮ МЮНХЕН" содержит только буквы, обычно чаще употребляемые в cp1251, и кодировка файла с единственной этой фразой принципиально не может быть правильно распознана подобным алгоритмом.

Еще хуже, чем с e-mail, обстоит дело с общением в режиме on-line, и, в частности, с обработкой сервером запросов WWW-броузера. Здесь текст от клиента может пойти совсем не в той кодировке, в какой запрашивались документы с сервера, и проблема автоматического определения кодировки и перекодировки входного текста становится исключительно актуальной. Проблема усугубляется как тем, что сервер не вправе приостановить свою интенсивную работу в ожидании вмешательства человека и ограниченностью ресурсов оперативной памяти, используемой одновременно порой для обработки сотен запросов, так и немногословностью получаемых от клиента запросов.

Итак, речь идет об алгоритме, который:

Вопреки ожиданиям, даже только первое из указанных требований не может быть удовлетворено полностью для всех файлов, содержащих закодированный русский текст, пусть даже и очень длинный, если допустить произвольные заранее не регламентированные кодировки. Для доказательства этого тезиса легко сочинить длинный файл, в котором нет относительно редких заглавных русских букв "Э" и "Ю", кроме один раз встретившегося женского имени "Юля" или "Эля", причем как бы эффективен ни был алгоритм, имя может оказаться не тем, которое он выберет. Таким образом, корректная постановка задачи требует фиксации конечного (но достаточно большого) числа реально встречающихся в Интернете кодировок, включая ошибочные.

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

Подробное описание и исходные тексты на C предполагается в cамое ближайшее время сделать доступными c http://rustex.botik.ru/znamensk/recode.