Архивы: по дате | по разделам | по авторам

Минутное дело

Архив
автор : Михаил Попов   29.06.1998

Dorogoy drug!

Как часто, начиная писать электронное письмо таким образом, мы путаемся в клавишах, мысленно ругая dorogogo druga за то, что он не удосужился поставить себе нормальный русификатор или почтовую программу. Но реальность есть реальность: мне часто приходится вести переписку с зарубежными коллегами, употребляя волапюк - уродливое дитя русских кодировок. У кого-то из "наших" за границей не хватает сил, чтобы русифицировать Windows, кому-то достался Macintosh или Unix. Кроме того, стараниями наших дорогих (и дешевых) провайдеров, упорно перекодирующих русские тексты, такой извращенный способ переписки приходится употреблять и в России. В любом случае "по-русски" могут и не прочитать, а вот "po-russki" понимают все. Не нужно говорить, что печатать в таком стиле страшно неудобно - руки уже привыкли к определенной раскладке клавиатуры, и каждая буква дается небольшим, но заметным усилием воли. А какими скупыми на слова и чувства выходят получаются pisma! Читать их, конечно, тоже не очень удобно, но что делать, если волапюк часто является единственным выходом из проблемы несовместимости операционных систем, почтовых программ и их пользователей.

 

Замечательная с точки зрения методической заметка Михаила Попова все-таки посвящена изобретению велосипеда. Как честный человек, не могу умолчать, что с перекодировкой русского на russkij и назад справляется, в числе прочих умений, агамовский MailReader (www.agama.com/mailreader): там среди восьми с лишним тысяч искажений языка стоит и "латиница". Из которой можно перешифроваться в обычный русский и в которую этот же обычный русский можно зашифровать. Правду сказать, не все письма на russkom поддаются полной дешифровке, а некоторые не поддаются вообще: сказывается, видать, отсутствие стандарта на ruglish. Однако обратная операция проходит всегда великолепно.

С другой стороны, за MailReader все-таки надо хоть не сразу, хоть немного - а платить. А предлагаемый Михаилом рецепт - совершенно бесплатен.
Е.К.


Хотелось бы, конечно, найти такую утилиту, которая бы преобразовывала русский текст в ту странную смесь латинских букв, которую только и может разобрать ваш собеседник на другом конце провода… Хотя, стоп! Зачем, собственно говоря, искать? Ведь утилита эта находится у многих просто под носом и называется Microsoft Word. Вполне резонно вы сможете возразить, что функции транслитерации в стандартной конфигурации Word'a нет. Да, это так, но на ее создание у вас уйдет не многим больше времени, чем на чтение этой заметки. Конечно, написанная мной за десять минут поделка далеко не оптимальна и ни в коей мере не может претендовать на показательный пример программирования на языке Word Basic. Я просто уверен, что каждый второй читатель "Компьютерры" сделает это лучше и, возможно, быстрее, чем я. Приводя свой маленький листинг, я хочу показать, что многие рутинные операции, которые каждому из нас приходится выполнять, можно автоматизировать с помощью программирования, и это гораздо проще, чем кажется на первый взгляд.

Итак, начинаем. Перед нами - Microsoft Word и задача написать программу транслитерации текста, то есть замены русских букв созвучными им латинскими. Как заменить одни буквы другими, используя средства Microsoft Word? Очень просто: вызвать функцию Replace из меню Edit и с ее помощью поменять, допустим, русскую букву "а" на латинскую "a", затем - "б" на "b"… и так еще 30 раз (позволю себе обойтись без "е"). Рассудок подсказывает, что функцию замены можно вписать один раз, а затем вызывать ее для каждой буквы. Чтобы не припоминать синтаксис Word Basic, воспользуемся функцией записи макрокоманд. Из меню Tools выбираем пункт Macro -> Record New Macro. В появившемся окне новорожденному макросу (или программе, как вам больше нравится) можно присвоить имя, допустим, "Translit", а также связать его с какой-нибудь кнопкой на инструментальной панели или с комбинацией клавиш. Наша задача - записать процедуру замены одной буквы на другую во всем тексте. Для этого выбираем Edit -> Replace, в поле "Find" пишем, допустим, "б", а в поле "Replace" - "b", нажимаем "Replace All" и останавливаем запись. Смотрим, что же получилось (Tools -> Macro -> Macros…, выбираем "Translit", нажимаем кнопку "Edit"). Перед нами возникает окно редактора Word Basic c нашей макрокомандой:

Sub Translit()

' Translit Macro

' Macro recorded 05.05.98 by Michael Popov

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

With Selection.Find

.Text = ChrW(1073)

.Replacement.Text = "b"

.Forward = True

.Wrap = wdFindContinue

.Format = False

.MatchCase = False

.MatchWholeWord = False

.MatchWildcards = False

.MatchSoundsLike = False

.MatchAllWordForms = False

End With

Selection.Find.Execute replace:=wdReplaceAll

End Sub

Это и будет "рыбой" для нашей программы. Теперь нужно записать эту операцию в цикл, чтобы проделать ее для каждой буквы. Вспомним, что Word Basic, как и обычный Basic, умеет работать с массивами. Зададим в начале программы два массива для русских и латинских букв:

Dim R(32), E(32)

…и наполним их содержанием (двоеточие позволяет разделить несколько команд на одной строке):

R(1) = "а" : E(1) = "a"

R(2) = "б" : E(2) = "b"

' … и так для каждой буквы …

Аналогично мы заполняем элементы массивов R и E соответствующими русскими и латинскими буквами. Все, основная часть работы сделана, осталось лишь записать цикл, который в окончательном виде будет выглядеть так. Обратите внимание, что на место конкретных букв для поиска и замены подставлены R(I) и E(I).

For I = 1 To 32

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

With Selection.Find

.Text = R(I)

.Replacement.Text = E(I)

.Forward = True

.Wrap = wdFindContinue

.Format = False

.MatchCase = False

.MatchWholeWord = False

.MatchWildcards = False

.MatchSoundsLike = False

.MatchAllWordForms = False

End With

Selection.Find.Execute replace:=wdReplaceAll

Next I

Программа написана. Ее можно запускать на выполнение (Tools -> Macro -> Macros -> Run, или через назначенную комбинацию клавиш, или через выбранный значок). Чтобы 97-ой Word не подсвечивал наш транслитерированный текст как одну большую орфографическую ошибку, в начало программы имеет смысл вставить следующую пару строчек:

ActiveDocument.ShowGrammaticalErrors = False

ActiveDocument.ShowSpellingErrors = False

Вот, собственно говоря, и вся премудрость. Теперь написанный и транслитерированный текст можно перенести в почтовую программу с помощью буфера Windows и отправить dorogomu drugu.

P.S. Написав за 10 минут утилиту транслитерации, я задался вопросом, как другие справляются с этой небольшой проблемой? Потратив на поиск в Интернете втрое больше времени, чем на вышеописанное программирование, я, наконец, нашел макрос Александра Дворжицкого, который можно бесплатно переписать по адресу www.r-style.ru/offext1/a5.asp#perevod. Нужно отметить, что сделан он с точки зрения программиста, гораздо более грамотно и, кажется, работает быстрее, чем мой. Если вам больше по душе готовые решения, позвольте рекомендовать именно его.

© ООО "Компьютерра-Онлайн", 1997-2021
При цитировании и использовании любых материалов ссылка на "Компьютерру" обязательна.