Библиотека сайта rus-linux.net
7. Использование кириллицы в программах электронной почты и чтения новостей
Настройка программ электронной почты и чтения новостей для распознавания кириллицы не очень сложна, хотя вам следует знать основные принципы работы электронной почты и новостей.
Обычно программы Internet электронной почты состоят из двух частей:
MUA (Mail User Agent -- пользовательская программа электронной почты) и
MTA (Mail Transfer Agent -- программа рассылки электронной почты).
MUA - это программа,
которую вы используете для чтения, составления и посылки электронных
сообщений. Однако пользовательская программа электронной почты
сама письма не посылает; вместо этого она
вызывает программу рассылки электронной почты, которая отвечает
за посылку сообщения
в соответствующем направлении, используя соответствующий протокол.
Пример пользовательской программы электронной почты -- Pine
,
программы рассылки электронной почты -- qmail
.
До недавнего времени и MTA, и MUA по умолчанию не были чисто 8-ми битными программами. Поэтому, когда вы посылаете сообщение, скажем, из Америки в Россию, то вы никогда не будете уверены в том, что какая-нибудь промежуточная программа рассылки электронной почты не "откусит" в вашем сообщении 8-ой бит у каждой буквы в вашем сообщении. Поэтому был разработан ряд протоколов, которые позволяют закодировать любой тип данных с использованием только печатаемых символов из 7-ми битного ASCII. Эта группа протоколов зовётся MIME (MultimedIa Mail Encoding -- мультимедийная кодировка электронных сообщений).
Так как MIME обычно сконфигурирован по умолчанию довольно правильно, мы не будем обсуждать его здесь. Мы поговорим о MIME, когда будет обсуждаться совместимость между русскими кодировками (См. раздел mime).
Мы начнём с настройки пользовательской программы электронной почты, потому что именно с этой программой вы работаете непосредственно. Ей нужно указать:
- что письма будут содержать 8-битные символы,
- с какой кодировкой вы работаете, и
- с какой кодировкой письма будут посылаться.
Конечно, указывая кодировку для посылаемых писем, вы должны действовать в соответствии с существующими стандартами. Стандарт для России: для электронной почты используется KOI8-R, именем этой кодировки согласно рекомендаций IANA является koi8-r. В Болгарии же для электронной почты используется кодировка cp1251, имя согласно IANA -- windows-1251.
(Письма, которые получал (и посылал) Антон Зиновьев в Сербию и Македонию, использовали кодировку ISO-8859-5. Но пользователи Windows вряд ли используют ISO-8859-5 -- так что какая кодировка является стандартом для этих стран, совершенно непонятно.)
Дополнение: Довольно часто случается так, что те, кто посылают
вам письма, неправильно настраивают (или не настраивают вообще,
а по умолчанию стоит чёрте-чё -- пример Outlook) свои почтовые
программы. В заголовках писем вместо windows-1251
чаще всего
стоит iso-8859-1
, US-ASCII
или UNKNOWN-8BIT
. Для
исправления получаемых писем создайте файл ~/.procmailrc
со
следующим содержанием (но я предупреждаю вас, что после ошибки в
~/.procmailrc
вы можете потерять всю вашу почту):
:0 fHw * ^Content-Type: *text/plain; *charset="?(iso-8859-1|US-ASCII|UNKNOWN-8BIT)"? | formail -i "Content-Type: text/plain; charset=windows-1251"
7.1 Настройка пользовательской программы электронной почты (MUA)
Emacs
Если вы уже настроили emacs как таковой, то вам не нужно специально настраивать программу электронной почты, которая обеспечивается средствами Emacs. (Для настройки Emacs смотрите раздел Emacs и XEmacs).
elm
Добавьте следующую запись в ваш ~/.elm/elmrc
:
CHARSET=koi8-r
pine
Добавьте следующую запись в ~/.pinerc
для персональной
настройки или в /usr/lib/pine.conf
для настройки всей
системы (эту опцию можно настроить прямо из pine):
character-set=koi8-r
Вы можете также изменить настройку вашего Pine
для того,
чтобы предотвратить посылку письма в quoted-printable
кодировке.
enable-8bit-nntp-posting enable-8bit-esmtp-negotiation
Кроме того, удостоверьтесь, что вы имеете свежую версию pine
.
До недавнего времени эта программа имела различные проблемы с
русским кодировками.
Дополнение: Чтобы настроить перекодировку win в koi в pine
в .pinerc
следует прописать нечто вроде (это можно сделать
и из самого pine):
display-filters=_CHARSET(iso8859-5)_ /usr/local/bin/icat, _CHARSET(utf-8)_ /usr/local/bin/ucat, _CHARSET(windows-1251)_ /usr/local/bin/wcat
Вместо icat
, wcat
и ucat
можно написать,
скажем, iconv
-from что-надо -to что-надо, или recode
.
Главное -- писать с полным путём, а то у неё
паранойя (и это правильно).
mutt
Добавьте следующую запись в ваш ~/.muttrc
:
set charset=koi8-r set allow_8bit
Эта программа автоматически перекодирует получаемые письма, если они
написаны не в стандартной кодировке. Кроме того, она умеет
перекодировать отправляемые письма, если вы используете кодировку,
отличную от стандартной для электронной почты в вашей стране --
если вы хотите воспользоваться этой особенностью, то укажите это в
~/.muttrc
.
Например, если вы живёте в России и используете cp1251, то,
чтобы ваши письма отправлялись в KOI8-R,
поместите
следующие три строки в ~/.muttrc
:
set Вперед Назад Содержание
12. Совместимость
Следовать стандарту -- это ещё не все. В реальной жизни надо обеспечить ещё и обратную совместимость. В нашем случае это означает, что наши настройки не должны препятствовать созданию данных с помощью других кодировок, отличных от стандартной. Это могут быть данные в CP866 или в CP1251. Также должна быть возможность запускать русскоязычные программы из MS-DOS.
В большинстве случаев (кроме HTTP) достаточно обеспечить преобразование данных в KOI8-R. Если мы говорим о данных с простой структурной организацией, то это просто -- смотрите раздел Символьная перекодировка.
Другое дело -- данные с определённой структурой. В этом случае действия не так тривиальны. Я попробую описать стандартные подходы для решения этой проблемы.
12.1 Совместимость данных в MIME формате
MIME формат -- стандартное архитектурно-независимое представление данных. Первоначально это представление данных было разработано для письменных сообщений, а сейчас его используют и в других местах. Стандарт MIME определяет формат, который открыт для расширений и позволяет поддержку и работу со специфическими данными. Например, если я послал письмо, содержащее MIME объект
video/mpeg
типа (MPEG файлы), моя программа приёма электронных сообщений автоматически декодирует его и запустит MPEG проигрыватель.Большинство UNIX программ, предлагающих MIME сервис, для этих целей используют пакет
metamail
, который содержит набор утилит и файлов данных для работы с объектами MIME. Несколько файлов конфигурации (/etc/mailcap
для системной настройки и~/.mailcap
-- для пользовательской настройки) определяют директивы для работы с объектами MIME различных типов.Поэтому если вы получили поток MIME данных, содержащий текст в одной из устаревших кодировок, вы можете определить соответствующие MIME-директивы для конвертации такого текста в KOI8.
Ниже перечислены MIME-законы, которые описывают правила работы с обычными текстами и текстами в richtext формате, использующими другие кодировки, отличные от KOI8. Вы можете вставить эти директивы в один из файлов конфигурации MIME.
Обратите внимание: Эти директивы используют пакет
translit
для того, чтобы производить само преобразование. Для более полной информации об этой программе и для информации по перекодировке смотрите раздел Символьная перекодировка.
text/plain; translit -t cp1251-koi8.rus < %s; test=test \ "`echo %{charset} | tr '[A-Z]' '[a-z]'`" = cp1251; copiousoutput text/richtext; translit -t cp1251-koi8.rus < %s; test=test \ "`echo %{charset} | tr '[A-Z]' '[a-z]'`" = cp1251; copiousoutput text/plain; translit -t alt-koi8.rus < %s; test=test \ "`echo %{charset} | tr '[A-Z]' '[a-z]'`" = cp866; copiousoutput text/richtext; translit -t alt-koi8.rus < %s; test=test \ "`echo %{charset} | tr '[A-Z]' '[a-z]'`" = cp866; copiousoutput text/plain; translit -t alt-koi8.rus < %s; test=test \ "`echo %{charset} | tr '[A-Z]' '[a-z]'`" = alt; copiousoutput text/richtext; translit -t alt-koi8.rus < %s; test=test \ "`echo %{charset} | tr '[A-Z]' '[a-z]'`" = alt; copiousoutput
Это работает только в случае обычного текста. Бинарные файлы данных должны сами отрабатывать данные в различных кодировках (По крайней мере, это должны делать программы, создавшие их). Поэтому если вы послали файл Microsoft Word в кодировке cp1251, то с этим должна разобраться программа, в которой вы читаете этот текст (Например MS Word или Applix Words).
К несчастью, действительная ситуация далека от идеала. Много программных продуктов имеют собственные идеи по поводу того, как использовать MIME. До недавнего времени Microsoft Mail использовал испорченный механизм работы с MIME. Хотя и Netscape Navigator/Communicator клиент отправки/приёма сообщений известен тем, что шлёт текст письма в cp1251, а его заголовок в charset=koi8-r кодировке и наоборот.
Довольно часто случается так, что те, кто посылают вам письма, неправильно настраивают (или не настраивают вообще, а по умолчанию стоит чёрте-чё -- пример Outlook) свои почтовые программы. В заголовках писем вместо
windows-1251
чаще всего стоитiso-8859-1
,US-ASCII
илиUNKNOWN-8BIT
. Для исправления получаемых писем создайте файл~/.procmailrc
со следующим содержанием (но я предупреждаю вас, что после ошибки в~/.procmailrc
вы можете потерять всю вашу почту):
:0 fHw * ^Content-Type: *text/plain; *charset="?(iso-8859-1|US-ASCII|UNKNOWN-8BIT)"? | formail -i "Content-Type: text/plain; charset=windows-1251"
12.2 Символьная перекодировка
В Internet можно найти множество программ, перекодирующих кириллические тексты. Каждая из них имеет свою изюминку и отличается степенью поддержки кириллицы.
С моей точки зрения, утилиты должны быть стандартными. В нашем, частном, случае такой "стандартной" утилитой является GNU recode. ( http://www.iro.umontreal.ca/~pinard/recode/).
Например, чтобы перекодировать из cp1251 в koi8-r, следует сказать:
$ recode CP1251..KOI8-R winfile.txtВнимание!: Для перекодировки в/из KOI8-U в GNU recode надо использовать koi8-ru, под koi8-u оно понимает что-то другое.
Так же широко распространены iconv (входит в поставку glibc)
Опять же cp1251 в koi8-r:
$ iconv -f866 -tKOI8-R -o<outfile> infileМожно воспользоваться пакетом translit. Он поддерживает много популярных кодировок и даже способен создавать TeX файлы (см. раздел tex ) на русском языке.
В конце концов сгодится обычный lynx (cp1251 в koi8-r):
$ lynx -assume_local_charset cp1251 file.txtДля других программ преобразования -- загляните на страничку SovInformBureau или на ftp.funet.fi. Вы даже можете использовать специальную моду для
emacs
(Смотрите раздел Emacs и XEmacs).
P.S. Для перекодировки я обычно пользуюсь перловым скриптом от Ilgiz Kalmetev. Утилита 2k предназначена для перекодирования кириллического текста. Понимает кодировки -- koi8-r, alt, cp1251, iso-8859-5, mac. Может определять кодировку автоматически.
12.3 Кириллические имена файлов в файловой системе MS Windows
Windows имеет возможность давать имена файлов в кодировке Unicode, поэтому пользователи могут давать осмысленные имена своим файлам. Linux, однако, не даёт полной поддержки для Unicode, поэтому если вы монтируете диск Windows VFAT, то увидите, что подобные имена состоят из вопросительных знаков и прочего мусора.
Здесь указан путь, как получить правильное преобразование:
- Убедитесь, что ваше ядро скомпилировано с поддержкой codepage (в частности, с поддержкой кодовых страниц cp866 и KOI8-R -- возможно, в виде модулей
ls /lib/modules/`uname -r`/fs/nls_*
).- Добавьте следующие опции при выполнении mount команды
mount
:codepage=866,iocharset=koi8-rили пропишите в/etc/fstab/
примерно такую строчку:/dev/hda5 /mnt/d vfat noexec,dev,suid,rw,umask=002, codepage=866,iocharset=koi8-r, gid=101 0 0для выяснения подробностей смотрите man mount.
Более подробно смотрите
Documentation/filesystems/vfat.txt
в исходниках ядра Linux.
12.4 Поддержка кириллицы в DOS эмуляторе
Это, видимо, единственный программный продукт, который требует присутствия
CP866
кодировки. Основанием является то, чтоCP866
- это родная кириллическая кодовая страница DOS. Большинство программ, работающих в DOS с кириллицей, ориентированы наCP866
.Для консольной версии (
dos
) вы должны загрузить только клавиатуру и экранный драйвер. Большинство драйверов DOS будет прекрасно работать. А. Беликов используетrk
драйвер А. Страхова, который работает и для консоли, и X версииdosemu
.Другая альтернатива -- это
r
драйвер Вадима Курлянда (последняя версия этого драйвера -- 2.0, и его развитие прекращено). Он прекрасно настраивается и поддерживает много кодировок, в том числеCP866
иKOI8
. Однако он, вероятно, не будет работать для X Window (по крайней мере, версия 1.14 не работает).До сих пор остаётся популярной программа-кириллизатор
keyrus
(например на Украине). Кроме латиницы она умеет ещё две раскладки (их можно редактировать).Эти русификаторы можно найти в большинстве Российских Internet архивов, например, в ftp архиве Курчатовского Института Ядерной Физики.
Кроме того, есть патч в http://www.ice.ru/~vitus/misc/, который позволяет обойтись без русификатора клавиатуры. Этот патч рекомендуется в X-ах, так как позволяет избежать двух клавиш переключения: одной в DOS, другой -- на остальном десктопе. Для работы с удалённым dosemu (по telnet/ssh/rsh) патч является необходимым условием.
Для X-овых версий
dosemu
вы должны установить соответствующий X шрифт с 866-ой кодировкой. Взять можно по адресам http://www.ice.ru/~vitus/works/x11.html, или ftp.dosemu.org, или взять у автора (эти шрифты сделал Дима Болховитянов) www.inp.nsk.su/~bolkhov.Кроме шрифтов в кодировке cp866, там можно найти и другие кириллические шрифты. Например,
vga_bul8x16.pcf.gz
иvga_bul.pcf.gz
имеют кодировку МИК (Болгария), vga_ruscii_8x16.pcf.gz имеет украинскую "досовскую" кодировку ruscii.Для установки шрифтов для
dosemu
вы должны:
- Сделать этот шрифт доступным X-серверу -- для этого следует выполнить процедуру, описанную в разделе Настройка шрифтов X Window.
- Прикрутить этот шрифт к
dosemu
. Если шрифт только заменяет первоначальный шрифтvga
, то он будет опознан по умолчанию. Иначе вы должны описать его в/etc/dosemu.conf
:# Font to use (without filename extensions). For example: X { updatefreq 8 title "MS DOS" icon_name "xdos" font "vga-alt"}
И в заключение вы должны загрузить драйвер клавиатуры.
Обратите внимание, что вам не нужны экранные драйверы в X окне.
Не все драйверы будут работать, но, по крайней мере,
два из них будут: rk
А. Страхова, и cyrkeyb
Pete Kvitek;
однако лучше воспользоваться патчем
http://www.ice.ru/~vitus/misc/.
12.5 Поддержка кириллицы в программах gtk
Если gtk не находит нужных шрифтов, он режет 8-й бит.
Шрифты задаются в /etc/gtk/gtkrc.$LANG
. Поэтому нужно
создать файл gtkrc.ru
или поправить существующий. Внутри
должно быть примерно следующее (названия
шрифтов, размеры и прочие атрибуты можно исправить по вкусу,
но эти шрифты должны содержать кириллицу в koi8-r):
style "gtk-default-ru" { fontset = "-cronyx-helvetica-medium-r-normal--*-*-*-*-*-*-koi8-r,\ -cronyx-courier-medium-r-normal--*-*-*-*-*-*-koi8-r,\ -cronyx-fixed-medium-r-normal--*-*-*-*-*-*-koi8-r,\ -cronyx-times-medium-r-normal--*-*-*-*-*-*-koi8-r" } class "GtkWidget" style "gtk-default-ru"
и скопировать этот файл в 'gtkrc.ru_RU.KOI8-R'
, или сделать symlink:
$ cd /etc/gtk/ $ ln -s gtkrc.ru gtkrc.ru_RU.KOI8-R
Подробности см. www.gtk.org, а также http://www.linux.org.ru/gnome/
gtk понимает национальные файлы gtkrc с именами типа
gtkrc.ru_RU.koi8r
(не gtkrc.ru_RU.KOI8-R
). Это позволяет
хранить одновременно эти файлы для
нескольких locales, если не делать линк на gtkrc.ru
.
12.6 Поддержка кириллицы в perl
Поддержка locale в perl
Для того чтобы можно было выполнять регекспы на кириллических символах с ключом "i" (а так же использовать стандартные функции преобразование текста -- такие как uc, lc, sort и т.д.) в системах с корректной локализацией (FreeBSD, Linux на glibc 2.1) это делается так:
use locale; use POSIX qw (locale_h); setlocale(LC_CTYPE, 'ru_RU.KOI8-R');
(можно ещё выставить переменную окружения export LANG=ru_RU.KOI8-R
тогда будет достаточно вызова use locale;
в Perl-скрипте)
Символьная перекодировка средствами perl
Ниже идут примеры
- Пример 1:
sub wintokoi { my $pvdcoderwin=shift; $pvdcoderwin=~ tr/\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2 \xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5 \xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8 \xF9\xFA\xFB\xFC\xFD\xFE\xFF/\xE1\xE2\xF7\xE7\xE4\xE5\xF6\xFA\xE9\xEA\xEB\xEC \xED\xEE\xEF\xF0\xF2\xF3\xF4\xF5\xE6\xE8\xE3\xFE\xFB\xFD\xFF\xF9\xF8\xFC\xE0\xF1 \xC1\xC2\xD7\xC7\xC4\xC5\xD6\xDA\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD2\xD3\xD4\xD5 \xC6\xC8\xC3\xDE\xDB\xDD\xDF\xD9\xD8\xDC\xC0\xD1/; return $pvdcoderwin; }
- Пример 2:
sub dostoiso { my $pvdcoderwin=shift; $pvdcoderwin=~ tr/\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D \x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0 \xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xE0\xE1\xE2\xE3\xE4 \xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF/\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7 \xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB \xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF \xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF/; return $pvdcoderwin; }
Остальное получается по аналогии.
Вперед Назад Содержание charset=windows-1251 set send_charset=koi8-r set allow_8bit
Если версия sendmail старше 8, то, вероятно, в
~/.muttrc
следует добавить директиву:
set use_8bitmime
7.2 Настройка вашей программы рассылки электронной почты (MTA)
В "природе" существует несколько программ рассылки электронной почты (MTA),
доступных для вас. Это sendmail
, qmail
, smail
, exim
,
и так далее.
sendmail
Начиная с версии 8, sendmail
по умолчанию правильно обрабатывает 8ми
битные данные. Если этого не происходит -- проверьте опцию
EightBitMode
и опцию 7
в разделе mailers в вашем файле
/etc/sendmail.cf
. Подробнее смотрите руководство
"Sendmail. Operation and Installation Guide".
В данный момент sendmail
больше не откусывает 8-мой бит.
Однако он может закодировать 8-ми битные данные с помощью
специального base64 формата кодировки. Хотя большинство
программ чтения электронных сообщений распознают и декодируют
подобные сообщения обратно в 8ми битный текст, вы, вероятно, хотите
посылать просто текст и быть уверенным, что все работает нормально.
Другие программы рассылки электронной почты
Я немного знаю о других программах рассылки почты. Если вы что-то знаете, что может быть важно для настройки кириллицы, то пожалуйста, сообщите мне.
7.3 Настройка программы чтения новостей
Читать новостные группы можно с помощью Emacs (раздел Emacs и XEmacs) или pine (раздел pine), но лучше воспользоваться специализированными программами -- такими как tin.
tin
Если ваш tin работает, то есть вы можете читать/вводить кириллицу, то лучше ничего не менять, если же у вас возникают проблемы, то выполните следующие действия:
- Установите последнюю версию tin -- можно пропустить
- Для включения возможности отображения кириллицы в
файле конфигурации
~/.tin/tinrc
сделайтеpost_mime_encoding=8bit mail_mime_encoding=8bit
- Для включения mime (смотрите раздел
mime
)
установите переменную окружения
MM_CHARSET
равную KOI8-R и закомментируйте переменнуюmm_charset
в файле конфигурации~/.tin/tinrc
, или просто приравняйтеmm_charset
из~/.tin/tinrc
KOI8-R (эта опция "перебивает" установку MM_CHARSET).mm_charset=koi8-r
Про mime: Так нужен или не нужен mime?
Сергей Дубров:В news-ах -- скорее нет, чем да -- с mime проблем больше, с тем же "сабжектом". Пишите себе в KOI8-R, без mime -- вас поймут. А вот в e-mail лучше mime все-таки использовать.
gnus
Для начала надо настроить MULE (См. раздел MULE).
Далее в .emacs добавить фразу:
(gnus-mule-add-group "fido7" 'cyrillic-koi8)
Вперед Назад Содержание