Минутное дело
АрхивDorogoy drug!
Как часто, начиная писать электронное письмо таким образом, мы путаемся в клавишах, мысленно ругая dorogogo druga за то, что он не удосужился поставить себе нормальный русификатор или почтовую программу. Но реальность есть реальность: мне часто приходится вести переписку с зарубежными коллегами, употребляя волапюк - уродливое дитя русских кодировок. У кого-то из "наших" за границей не хватает сил, чтобы русифицировать Windows, кому-то достался Macintosh или Unix. Кроме того, стараниями наших дорогих (и дешевых) провайдеров, упорно перекодирующих русские тексты, такой извращенный способ переписки приходится употреблять и в России. В любом случае "по-русски" могут и не прочитать, а вот "po-russki" понимают все. Не нужно говорить, что печатать в таком стиле страшно неудобно - руки уже привыкли к определенной раскладке клавиатуры, и каждая буква дается небольшим, но заметным усилием воли. А какими скупыми на слова и чувства выходят получаются pisma! Читать их, конечно, тоже не очень удобно, но что делать, если волапюк часто является единственным выходом из проблемы несовместимости операционных систем, почтовых программ и их пользователей.
|
Хотелось бы, конечно, найти такую утилиту, которая бы преобразовывала русский текст в ту странную смесь латинских букв, которую только и может разобрать ваш собеседник на другом конце провода… Хотя, стоп! Зачем, собственно говоря, искать? Ведь утилита эта находится у многих просто под носом и называется 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. Нужно отметить, что сделан он с точки зрения программиста, гораздо более грамотно и, кажется, работает быстрее, чем мой. Если вам больше по душе готовые решения, позвольте рекомендовать именно его.