Транслитерация текстовой строки средствами VBA
|
Function Translit(ByVal txt As String) As String
iRussian$ = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
iTranslit = Array("", "a", "b", "v", "g", "d", "e", "jo", "zh", "z", "i", "jj", "k", _
"l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "h", "c", "ch", _
"sh", "zch", "''", "'y", "'", "eh", "ju", "ja")
For iCount% = 1 To 33
txt = Replace(txt, Mid(iRussian$, iCount%, 1), iTranslit(iCount%), , , vbTextCompare)
Next
Translit$ = txt
End Function
Sub ПримерИспользованияФункцииTranslit()
txt = "проверка работы транслита"
newtxt = Translit(txt) ' результат = строка "proverka rabot'y translita"
MsgBox "Строка """ & txt & """" & vbNewLine & "преобразована в строку """ _
& newtxt & """", vbInformation, "Результат обработки"
End Sub
Надстройку для транслитерации выделенного диапазона ячеек, а также расширенную версию функции транслитерации, можно скачать в этой статье
(добавлено в связи с просьбой выполнить обратную транслитерацию) К сожалению, процесс обратной транслитерации весьма затруднён (я бы даже сказал, что в общем случае невозможно сделать такую функцию, которая преобразовывала бы строку после транслитерации к исходному виду).
Попытаюсь объяснить, почему так происходит: Допустим, в качестве исходной строки у нас будет текст "щзч схш жзх"
Sub ПримерИспользованияФункцииTranslit()
txt = "щзч схш жзх"
newtxt = Translit(txt)
Debug.Print newtxt ' результат = строка "zchzch shsh zhzh"
MsgBox "Строка """ & txt & """" & vbNewLine & "преобразована в строку """ _
& newtxt & """", vbInformation, "Результат обработки"
End Sub
И что же мы видим на выходе? А вот что: "zchzch shsh zhzh"
Достаточно похожие сочетания букв, не правда ли? И как теперь макросу определить, что означает сочетание "zch sh zh" - "щ сх ж" или "зч ш ж"? Или, может, "зч сх зх"? Все варианты для макроса ведь равнозначны...
А сочетание "zhzh" следует перевести как "зхзх" или как "жж"? То же самое касается некоторых других буквосочетаний.
Специально проверил транслитерацию подобных сочетаний на популярном сервисе http://www.translit.ru/ Результат - при обратном переводе на русский исходная строка изменилась: схш жзх --> shsh zhzh --> шш жж
Вывод: учитывая возможное количество неопределённостей, проще обратную транслитерацию выполнять вручную.
Другой вариант функции:
Function Translit(ByVal txt As String) As String ' с учётом регистра символов
txtRussian$ = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
arrTranslit = Array("", "a", "b", "v", "g", "d", "e", "e", "zh", "z", "i", "y", "k", _
"l", "m", "n", "o", "p", "r", "s", "t", "u", "f", "kh", "ts", "tch", _
"sh", "sch", "", "y", "", "e", "yu", "ya")
For iCount% = 1 To 33
txt$ = Replace(txt$, Mid(txtRussian$, iCount%, 1), arrTranslit(iCount%), , , vbBinaryCompare) ' строчные
txt$ = Replace(txt$, UCase(Mid(txtRussian$, iCount%, 1)), UCase(arrTranslit(iCount%)), , , vbBinaryCompare) ' прописные
Next
Translit$ = txt$
End Function
Результат работы (другой набор символов для замены, учитывается регистр)
Исходная строка: "А-Б-В-Г-Д-Е-Ё-Ж-З-И-Й-К-Л-М-Н-О-П-Р-С-Т-У-Ф-Х-Ц-Ч-Ш-Щ-Ъ-Ы-Ь-Э-Ю-Я" Итоговая строка: "A-B-V-G-D-E-E-ZH-Z-I-Y-K-L-M-N-O-P-R-S-T-U-F-KH-TS-TCH-SH-SCH--Y--E-YU-YA"
|
|