Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Ветеран


Сообщения: 3320
Благодарности: 916

Профиль | Отправить PM | Цитировать


D.Y., можно развернуть словарь (с Dictionary(Char, Of String) на Dictionary(Of String, Char)) и проверять присутствие по три, два и одному символу в словаре.
Текущий словарь, предложенный во втором посте, при развороте потеряет несколько букв.
Нужно будет решить какие именно оставить
.Add("E", "Е") или '.Add("E", "Ё") или же .Add("E", "Э")
.Add("'", "Ъ") или .Add("Y", "Ы")


В VB.NET варианте, без разпознавания регистра, это можно так реализовать.
Код: Выделить весь код
Class Translit
    Shared Sub Main(ByVal CmdArgs() As String)
        Dim Translit2Cyrillic As New Dictionary(Of String, Char)
        With Translit2Cyrillic
            .Add("A", "А")
            .Add("B", "Б")
            .Add("V", "В")
            .Add("G", "Г")
            .Add("D", "Д")
            .Add("E", "Е")
            '.Add("E", "Ё")
            .Add("Zh", "Ж")
            .Add("Z", "З")
            .Add("I", "И")
            .Add("Y", "Й")
            .Add("K", "К")
            .Add("L", "Л")
            .Add("M", "М")
            .Add("N", "Н")
            .Add("O", "О")
            .Add("P", "П")
            .Add("R", "Р")
            .Add("S", "С")
            .Add("T", "Т")
            .Add("U", "У")
            .Add("F", "Ф")
            .Add("H", "Х")
            .Add("Ts", "Ц")
            .Add("Ch", "Ч")
            .Add("Sh", "Ш")
            .Add("Sch", "Щ")
            '.Add("'", "Ъ")
            '.Add("Y", "Ы")
            .Add("'", "Ь")
            '.Add("E", "Э")
            .Add("Yu", "Ю")
            .Add("Ya", "Я")
        End With
        Dim InputStr As String = vbNullString
        For Each st As String In CmdArgs
            InputStr = InputStr & st & " "
        Next
        'InputStr = "ABVGDEZhZIYKLMNOPRSTUFHTsChShSch'YuYaSch'ABABVGDEZhZIYKLMNOPRSTUFH"
        Dim i As Integer = 0
        Dim BufStr As String = vbNullString
        For i = 0 To InputStr.Length - 3
            BufStr = InputStr(i) & InputStr(i + 1) & InputStr(i + 2)
            If Translit2Cyrillic.ContainsKey(BufStr) Then
                Console.Write(Translit2Cyrillic(BufStr))
                i = i + 2
                Continue For
            End If
            BufStr = InputStr(i) & InputStr(i + 1)
            If Translit2Cyrillic.ContainsKey(BufStr) Then
                Console.Write(Translit2Cyrillic(BufStr))
                i = i + 1
                Continue For
            End If
            BufStr = InputStr(i)
            If Translit2Cyrillic.ContainsKey(BufStr) Then
                Console.Write(Translit2Cyrillic(BufStr))
                Continue For
            End If
            Console.Write(BufStr)
        Next
        If i = InputStr.Length - 3 Then
            BufStr = InputStr(i) & InputStr(i + 1) & InputStr(i + 2)
            If Translit2Cyrillic.ContainsKey(BufStr) Then
                Console.Write(Translit2Cyrillic(BufStr))
                i = i + 3
            End If
        End If
        If i = InputStr.Length - 2 Then
            BufStr = InputStr(i) & InputStr(i + 1)
            If Translit2Cyrillic.ContainsKey(BufStr) Then
                Console.Write(Translit2Cyrillic(BufStr))
                i = i + 2
            End If
        End If
        While i < InputStr.Length
            BufStr = InputStr(i)
            If Translit2Cyrillic.ContainsKey(BufStr) Then
                Console.Write(Translit2Cyrillic(BufStr))
            Else
                Console.Write(BufStr)
            End If
            i = i + 1
        End While
    End Sub
End Class
Перенести на С# и добавить распознавание регистра думаю проблем не составит.

Последний раз редактировалось Admiral, 07-05-2010 в 02:08.


Отправлено: 01:56, 07-05-2010 | #11