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
Перенести на С# и добавить распознавание регистра думаю проблем не составит.