АВТОМАТИЧЕСКОЕ ИСПРАВЛЕНИЕ ОШИБОЧНОЙ 
КОДИРОВКИ РУССКОГО ТЕКСТА
С.В. Знаменский
Институт программных систем РАН (г. Переславль-Залесский)
телефон +79109757236 e-mail svz@latex.pereslavl.ru

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

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

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

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

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

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

2. В каком смысле можно обеспечить безошибочность перекодировки и что для этого необходимо сделать.  Вопреки достаточно распространенным ожиданиям, задача автоматического определения правильной кодировки не может быть алгоритмически разрешена для всех файлов, содержащих закодированный русский текст, пусть даже и очень длинный, если допустить произвольные заранее не регламентированные кодировки. Для доказательства этого тезиса легко сочинить сколь угодно длинный текст, в котором нет относительно редких заглавных русских букв "Э" и "Ю" кроме один раз встретившегося женского имени "Юля" или "Эля". Если бы указанный алгоритм существовал, он должен был бы угадать, какое имя из этих двух упомянуто в тексте. Вероятность правильного угадывания в данном случае равна 1/2 и никакой дополнительной информации-подсказки нет. Ясно, что в описанной ситуации он не может быть безошибочным.

Таким образом, корректная постановка задачи автоматического определения требует фиксации конечного числа реально встречающихся в интернете кодировок, включая ошибочные. К таким базовым кодировкам кириллических букв следует в первую очередь отнести кодировки iso8859-5 и наиболее распространенные вариации KOI8, CP1251, MacCyrillic и cp866/альтернативной кодировки, кодировку, получающуюся из CP1251 инверсией седьмого бита и кодировки, получающиеся из вышеперечисленных неправильной перекодировкой, как, например, текст в KOI8 может неправильно настроенной программой быть принят за текст в CP1251 и перекодирован из CP1251 в KOI8 или иную кодировку. Базовый список таких ошибочных кодировок предполагается подготовить заранее и предусмотреть возможность пополнения его новыми уродцами. Для этой цели удобно использовать конфигурационный файл, который можно дополнять, не перекомпилируя саму программу.

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

3. Насколько велик объем данных, реально необходимый для рассматриваемой цели. Алгоритм, основанный на подсчете частот сочетаний пар букв, описанный в прилагаемой статье (TeX в кодировке ср866), обычно правильно выбирает одну из основных пяти кодировок даже у очень короткого текста, содержащего хотя бы одно русское слово не менее чем из пяти букв. Алгоритм успешно реализован, в прилагаемых архивах Вы можете найти оригинальные исходные тексты на C под UNIX (май 1998), исправления Геннадия Кудряшова (июнь 2000 г.), исходные тексты на C вместе с исполняемыми файлами под DOS, написанные при участии Вадима Зудилина (апрель 1998 г) и вариант на языке Перл, написанный и оптимизированный Алексом Эфросом по времени выполнения до сравнимого с оригиналом на С. Программы и исходные тексты могут быть свободно использованы. Просьба при распространении тестов, содержащих фрагменты исходников, не забывать об указаниях на авторство и при активном распространении программных продуктов, разработанных с использованием кода, порадовать авторов этой информацией. Размер усреднённых данных, полученных на основе анализа более чем 60 языков на кириллической основе, составил всего 5k, так что размер программы под MS DOS, скомпилированной на Watcom10.0 и правильно перекодирующей текст из любой (возможно неизвестной) из пяти стандартных кодировок в любую другую из них, не превысил 12k.

В препринте ( preprint.ps,233k) описывается и обосновывается подход, позволяющий при увеличении объема данных всего в 2-3 раза одновременно в сотни раз повысить эффективность распознавания кодировки, что позволит в десятки раз расширить список испытываемых кодировок без снижения надежности и ощутимого увеличения среднего времени распознавания.

Текст написан 3.11.98 года, последняя информация о новых разработках добавлена 26 июня 2000 года.

Перловые скрипты, добавленные 23 января 2020 года: 2koi8, 2dos, 2win, 2utf8, 2pdf принимают набор имён файлов в качестве аргументов командной строки, распознают входную кодировку среди пяти вышеописанных плюс utf8, сохраняют исходные файлы в неизменном виде, добавляя в имя файла указание кодировки и перекодирует их с сохранением времени в указанную в имени скрипта. Здесь pdf означает кириллическую кодировку фирмы Adobe в pdf-файлах, которая полезна при создании нестандартных pdf.

Все описанные файлы предоставлены в свободное пользование по лицензии CC-BY-4.0