Показать полную графическую версию : Транслитерация на С++, Java, C#.
Товарищи нет ли у кого программы для транслитерации написанной на С++,Java,C#?Вот нашел в сети немного инфы что скажете?Как лучше сделать такую прогу?
Гугл видимо не знает о реализации транслитерации на C#. Следующий код взят из плагина Rus to Lat для Wordpress.
Транслитерация переводит следующий текст
«Транслитерация русских символов английские» в
«Transliteraciya russkix simvolov v anglijskie»
Как и в плагине, предложенная транслитерация поддерживает два формата – ГОСТ 16876-71 и ISO 9-95.
Использование:
string outt = Transliteration.Front("Транслитерация русских символов URL в английские");
Console.WriteLine(outt);
Console.ReadLine();
Вот, собственно, сам класс.
using System;
using System.Collections.Generic;
using System.Text;
namespace Transliteration
{
public enum TransliterationType
{
Gost,
ISO
}
public static class Transliteration
{
private static Dictionary gost = new Dictionary(); //ГОСТ 16876-71
private static Dictionary iso = new Dictionary(); //ISO 9-95
public static string Front(string text)
{
return Front(text, TransliterationType.ISO);
}
public static string Front(string text, TransliterationType type)
{
string output = text;
Dictionary tdict = GetDictionaryByType(type);
foreach (KeyValuePair key in tdict)
{
output = output.Replace(key.Key, key.Value);
}
return output;
}
public static string Back(string text)
{
return Back(text, TransliterationType.ISO);
}
public static string Back(string text, TransliterationType type)
{
string output = text;
Dictionary tdict = GetDictionaryByType(type);
foreach (KeyValuePair key in tdict)
{
output = output.Replace(key.Value, key.Key);
}
return output;
}
private static Dictionary GetDictionaryByType(TransliterationType type)
{
Dictionary tdict = iso;
if (type == TransliterationType.Gost) tdict = gost;
return tdict;
}
static Transliteration()
{
gost.Add("Є", "EH");
gost.Add("І", "I");
gost.Add("і", "i");
gost.Add("№", "#");
gost.Add("є", "eh");
gost.Add("А", "A");
gost.Add("Б", "B");
gost.Add("В", "V");
gost.Add("Г", "G");
gost.Add("Д", "D");
gost.Add("Е", "E");
gost.Add("Ё", "JO");
gost.Add("Ж", "ZH");
gost.Add("З", "Z");
gost.Add("И", "I");
gost.Add("Й", "JJ");
gost.Add("К", "K");
gost.Add("Л", "L");
gost.Add("М", "M");
gost.Add("Н", "N");
gost.Add("О", "O");
gost.Add("П", "P");
gost.Add("Р", "R");
gost.Add("С", "S");
gost.Add("Т", "T");
gost.Add("У", "U");
gost.Add("Ф", "F");
gost.Add("Х", "KH");
gost.Add("Ц", "C");
gost.Add("Ч", "CH");
gost.Add("Ш", "SH");
gost.Add("Щ", "SHH");
gost.Add("Ъ", "'");
gost.Add("Ы", "Y");
gost.Add("Ь", "");
gost.Add("Э", "EH");
gost.Add("Ю", "YU");
gost.Add("Я", "YA");
gost.Add("а", "a");
gost.Add("б", "b");
gost.Add("в", "v");
gost.Add("г", "g");
gost.Add("д", "d");
gost.Add("е", "e");
gost.Add("ё", "jo");
gost.Add("ж", "zh");
gost.Add("з", "z");
gost.Add("и", "i");
gost.Add("й", "jj");
gost.Add("к", "k");
gost.Add("л", "l");
gost.Add("м", "m");
gost.Add("н", "n");
gost.Add("о", "o");
gost.Add("п", "p");
gost.Add("р", "r");
gost.Add("с", "s");
gost.Add("т", "t");
gost.Add("у", "u");
gost.Add("ф", "f");
gost.Add("х", "kh");
gost.Add("ц", "c");
gost.Add("ч", "ch");
gost.Add("ш", "sh");
gost.Add("щ", "shh");
gost.Add("ъ", "");
gost.Add("ы", "y");
gost.Add("ь", "");
gost.Add("э", "eh");
gost.Add("ю", "yu");
gost.Add("я", "ya");
gost.Add("«", "");
gost.Add("»", "");
gost.Add("—", "-");
iso.Add("Є", "YE");
iso.Add("І", "I");
iso.Add("Ѓ", "G");
iso.Add("і", "i");
iso.Add("№", "#");
iso.Add("є", "ye");
iso.Add("ѓ", "g");
iso.Add("А", "A");
iso.Add("Б", "B");
iso.Add("В", "V");
iso.Add("Г", "G");
iso.Add("Д", "D");
iso.Add("Е", "E");
iso.Add("Ё", "YO");
iso.Add("Ж", "ZH");
iso.Add("З", "Z");
iso.Add("И", "I");
iso.Add("Й", "J");
iso.Add("К", "K");
iso.Add("Л", "L");
iso.Add("М", "M");
iso.Add("Н", "N");
iso.Add("О", "O");
iso.Add("П", "P");
iso.Add("Р", "R");
iso.Add("С", "S");
iso.Add("Т", "T");
iso.Add("У", "U");
iso.Add("Ф", "F");
iso.Add("Х", "X");
iso.Add("Ц", "C");
iso.Add("Ч", "CH");
iso.Add("Ш", "SH");
iso.Add("Щ", "SHH");
iso.Add("Ъ", "'");
iso.Add("Ы", "Y");
iso.Add("Ь", "");
iso.Add("Э", "E");
iso.Add("Ю", "YU");
iso.Add("Я", "YA");
iso.Add("а", "a");
iso.Add("б", "b");
iso.Add("в", "v");
iso.Add("г", "g");
iso.Add("д", "d");
iso.Add("е", "e");
iso.Add("ё", "yo");
iso.Add("ж", "zh");
iso.Add("з", "z");
iso.Add("и", "i");
iso.Add("й", "j");
iso.Add("к", "k");
iso.Add("л", "l");
iso.Add("м", "m");
iso.Add("н", "n");
iso.Add("о", "o");
iso.Add("п", "p");
iso.Add("р", "r");
iso.Add("с", "s");
iso.Add("т", "t");
iso.Add("у", "u");
iso.Add("ф", "f");
iso.Add("х", "x");
iso.Add("ц", "c");
iso.Add("ч", "ch");
iso.Add("ш", "sh");
iso.Add("щ", "shh");
iso.Add("ъ", "");
iso.Add("ы", "y");
iso.Add("ь", "");
iso.Add("э", "e");
iso.Add("ю", "yu");
iso.Add("я", "ya");
iso.Add("«", "");
iso.Add("»", "");
iso.Add("—", "-");
}
}
}
D.Y. есть на VB.NET (выполнена в виде консольной программы), перенести на C# думаю проблем не составит.
А если всё же будет составлять, то для этих .NET языков есть конвертор (http://www.developerfusion.com/tools/convert/vb-to-csharp/)
Imports System
Imports System.Collections.Generic
Class Translit
Shared Sub Main(ByVal CmdArgs() As String)
Dim Cyrillic2Translit As New Dictionary(Of Char, String)
With Cyrillic2Translit
.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 = Console.ReadLine
For Each ch As Char In InputStr.ToCharArray
If Cyrillic2Translit.ContainsKey(ch) Then
Console.Write(Cyrillic2Translit(ch))
ElseIf Cyrillic2Translit.ContainsKey(Char.ToUpper(ch)) Then
Console.Write(Cyrillic2Translit(Char.ToUpper(ch)).ToLower)
Else
Console.Write(ch)
End If
Next
Console.Read()
End Sub
End Class
Словарь, в своё время, взят отсюда (http://forum.oszone.net/post-653352.html#post653352)
Хороший пример, но возможно придется переделать немного(дописать нижний регистр) ведь здесь нет учета регистра.Я думаю что так будет правильнее.
D.Y., здесь есть учёт регистров.
If Cyrillic2Translit.ContainsKey(ch) Then
Console.Write(Cyrillic2Translit(ch))
ElseIf Cyrillic2Translit.ContainsKey(Char.ToUpper(ch)) Then
Console.Write(Cyrillic2Translit(Char.ToUpper(ch)).ToLower)
Else
Console.Write(ch)
А вот если б в словаре были буквы для регистров двух случаев пример бы был не очень, так как нёс избыточность.
Translit.exe Хороший пример, но возможно придется переделать немного(дописать нижний регистр) ведь здесь нет учета регистра.Я думаю что так будет правильнее.
Horoshiy primer, no vozmozhno pridetsya peredelat' nemnogo(dopisat' nizhniy registr) ved' zdes' net ucheta registra.Ya dumayu chto tak budet pravil'nee.
прошу прощения не заметил.
А как можно сделать обратную транслитерацию снова использовать массивы или есть какая нибудь функция ?
D.Y., если на VB.NET то готовой функции нету.
Да можно воспользоваться словарём.
Для некоторых букв (.Add("Ъ", "'"), .Add("Ь", "'")) или предлагать пользователю при распознании варианты, или самостоятельно в программе анализировать (по частоте использования в языке или более сложный вариант - по грамматическим правилам).
Буквы транслирующие в несколько (.Add("Ж", "Zh"), .Add("Ц", "Ts"), .Add("Ч", "Ch"), .Add("Ш", "Sh"), .Add("Щ", "Sch")) - заслуживают отдельной обратной транслитерации.
Есть вот такой вариант транслитерации но у меня почему то не отображает текст во втором "Textboxе".Не могли бы вы мне подсказать в чем причина??
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
Dictionary<string, string> words = new Dictionary<string, string>();
public Form1()
{
InitializeComponent();
words.Add("а", "a");
words.Add("б", "b");
words.Add("в", "v");
words.Add("г", "g");
words.Add("д", "d");
words.Add("е", "e");
words.Add("ё", "yo");
words.Add("ж", "zh");
words.Add("з", "z");
words.Add("и", "i");
words.Add("й", "j");
words.Add("к", "k");
words.Add("л", "l");
words.Add("м", "m");
words.Add("н", "n");
words.Add("о", "o");
words.Add("п", "p");
words.Add("р", "r");
words.Add("с", "s");
words.Add("т", "t");
words.Add("у", "u");
words.Add("ф", "f");
words.Add("х", "h");
words.Add("ц", "c");
words.Add("ч", "ch");
words.Add("ш", "sh");
words.Add("щ", "sch");
words.Add("ъ", "j");
words.Add("ы", "i");
words.Add("ь", "j");
words.Add("э", "e");
words.Add("ю", "yu");
words.Add("я", "ya");
words.Add("А", "A");
words.Add("Б", "B");
words.Add("В", "V");
words.Add("Г", "G");
words.Add("Д", "D");
words.Add("Е", "E");
words.Add("Ё", "Yo");
words.Add("Ж", "Zh");
words.Add("З", "Z");
words.Add("И", "I");
words.Add("Й", "J");
words.Add("К", "K");
words.Add("Л", "L");
words.Add("М", "M");
words.Add("Н", "N");
words.Add("О", "O");
words.Add("П", "P");
words.Add("Р", "R");
words.Add("С", "S");
words.Add("Т", "T");
words.Add("У", "U");
words.Add("Ф", "F");
words.Add("Х", "H");
words.Add("Ц", "C");
words.Add("Ч", "Ch");
words.Add("Ш", "Sh");
words.Add("Щ", "Sch");
words.Add("Ъ", "J");
words.Add("Ы", "I");
words.Add("Ь", "J");
words.Add("Э", "E");
words.Add("Ю", "Yu");
words.Add("Я", "Ya");
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
string source = textBox1.Text;
foreach (KeyValuePair<string, string> pair in words)
{
source = source.Replace(pair.Key, pair.Value);
}
textBox2.Text = source;
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void textBox1_TextChanged_1(object sender, EventArgs e)
{
}
}
}
D.Y., не знакома конструкция - KeyValuePair<string, string> pair in words.
Функцию private void textBox1_TextChanged(object sender, EventArgs e) переписал бы так
private void textBox1_TextChanged(object sender, EventArgs e)
{
string source = textBox1.Text;
string destiny = null;
for(int i = 0; i < source.Length; i++)
{
if (words.ContainsKey(source))
destiny = destiny + words[source[i]];
else
destiny = destiny + source[i];
}
textBox2.Text = destiny;
}
словарь объявил как Dictionary<char, string> words = new Dictionary<char, string>();.
В этом случаи в C#, в отличии от VB.NET, сами буквы должны быть заключены в одинарные кавычки (на примере первой буквы - words.Add([i]'а', "a"); вместо words.Add("а", "a");.
Вот я немного переделал программу добавив проверку регистра тем самым избавив ее от избыточности
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
Dictionary<char, string> words = new Dictionary<char, string>();
public Form1()
{
InitializeComponent();
words.Add('а', "a");
words.Add('б', "b");
words.Add('в', "v");
words.Add('г', "g");
words.Add('д', "d");
words.Add('е', "e");
words.Add('ё', "yo");
words.Add('ж', "zh");
words.Add('з', "z");
words.Add('и', "i");
words.Add('й', "j");
words.Add('к', "k");
words.Add('л', "l");
words.Add('м', "m");
words.Add('н', "n");
words.Add('о', "o");
words.Add('п', "p");
words.Add('р', "r");
words.Add('с', "s");
words.Add('т', "t");
words.Add('у', "u");
words.Add('ф', "f");
words.Add('х', "h");
words.Add('ц', "c");
words.Add('ч', "ch");
words.Add('ш', "sh");
words.Add('щ', "sch");
words.Add('ъ', "j");
words.Add('ы', "i");
words.Add('ь', "j");
words.Add('э', "e");
words.Add('ю', "yu");
words.Add('я', "ya");
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void textBox1_TextChanged_1(object sender, EventArgs e)
{
string source = textBox1.Text;
string destiny = null;
for (int i = 0; i < source.Length; i++)
{
if (words.ContainsKey(source[i]))
destiny = destiny + words[source[i]];
else
destiny = destiny + source[i];
}
System.Text.StringBuilder sb = new System.Text.StringBuilder(destiny);
for (int j = 0; j < sb.Length; j++)
{
if (System.Char.IsLower(sb[j]) == true)
sb[j] = System.Char.ToLower(sb[j]);
else if (System.Char.IsUpper(sb[j]) == true)
sb[j] = System.Char.ToUpper(sb[j]);
}
string corrected = sb.ToString();
textBox2.Text = corrected;
}
}
}
Сейчас ломаю голову нед обратной транслитерацией точнее над Ж,Ч,Ш,Щ,Я,Ю и тд. Может есть идеи.
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
Перенести на С# и добавить распознавание регистра думаю проблем не составит.
Если честно то проблемы с преобразованием возникли в C# я VB вообще не пользовался пытался перевести вот что получилось.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
Dictionary<char, string> words = new Dictionary<char, string>();
Dictionary<string, char> words1 = new Dictionary<string, char>();
public Form1()
{
InitializeComponent();
words.Add('а', "a");
words.Add('б', "b");
words.Add('в', "v");
words.Add('г', "g");
words.Add('д', "d");
words.Add('е', "e");
words.Add('ё', "yo");
words.Add('ж', "zh");
words.Add('з', "z");
words.Add('и', "i");
words.Add('й', "j");
words.Add('к', "k");
words.Add('л', "l");
words.Add('м', "m");
words.Add('н', "n");
words.Add('о', "o");
words.Add('п', "p");
words.Add('р', "r");
words.Add('с', "s");
words.Add('т', "t");
words.Add('у', "u");
words.Add('ф', "f");
words.Add('х', "h");
words.Add('ц', "c");
words.Add('ч', "ch");
words.Add('ш', "sh");
words.Add('щ', "sch");
words.Add('ъ', "j");
words.Add('ы', "i");
words.Add('ь', "j");
words.Add('э', "e");
words.Add('ю', "yu");
words.Add('я', "ya");
words1.Add("a", 'а');
words1.Add("b",'б');
words1.Add("c", 'ц');
}
private void textBox4_TextChanged(object sender, EventArgs e)
{
}
//Obratnaya transliteraciya
private void textBox3_TextChanged(object sender, EventArgs e)
{
string source = textBox3.Text;
int i=0;
string BufStr = textBox3.Text;
for ( i = 0; i < source.Length -3; i++)
{
BufStr = source + source[i + 1] + source[i + 2];
if (words1.ContainsKey(BufStr))
{
textBox4.Text = BufStr;
i = i + 2;
}
BufStr = source ;
if(words1.ContainsKey(BufStr))
{
textBox4.Text = BufStr;
}
textBox4.Text = BufStr;
}
if( i < source.Length - 3)
{
BufStr = source + source [i + 1] + source [i + 2];
if(words1.ContainsKey(BufStr))
{
textBox4.Text = BufStr;
i = i + 3;
}
}
if(i < source.Length - 2)
{
BufStr = source + source [i + 1];
if(words1.ContainsKey(BufStr))
{
textBox4.Text = BufStr;
i = i + 2;
}
}
}
//konec
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
private void textBox1_TextChanged_1(object sender, EventArgs e)
{
string source = textBox1.Text;
string destiny = null;
for (int i = 0; i < source.Length; i++)
{
if (words.ContainsKey(source[i]))
destiny = destiny + words[source[i]];
else
destiny = destiny + source[i];
}
System.Text.StringBuilder sb = new System.Text.StringBuilder(destiny);
for (int j = 0; j < sb.Length; j++)
{
if (System.Char.IsLower(sb[j]) == true)
sb[j] = System.Char.ToLower(sb[j]);
else if (System.Char.IsUpper(sb[j]) == true)
sb[j] = System.Char.ToUpper(sb[j]);
}
string corrected = sb.ToString();
textBox2.Text = corrected;
}
}
}
но оно не работает я добавил еще два текстбокса и работал с ними.Если можно то переведите мне на с-шарп с VB.
D.Y., в предыдущем посте во втором выборе букв имел ввиду следующий выбор (какую букву оставить), при повороте словаря
.Add("Y", "Й") или .Add("Y", "Ы")
.Add("'", "Ъ") или .Add("'", "Ь")
private void textBox3_TextChanged(object sender, EventArgs e)
{
string InputStr = textBox3.Text, BufStr = null, destiny = null;
int i = 0;
for (i = 0; i < InputStr.Length - 3; i++)
{
BufStr = null;
BufStr = BufStr + InputStr + InputStr[i + 1] + InputStr[i + 2];
if (words1.ContainsKey(BufStr))
{
destiny = destiny + words1[BufStr];
i = i + 2;
continue;
}
BufStr = null;
BufStr = BufStr + InputStr[i] + InputStr[i + 1];
if (words1.ContainsKey(BufStr))
{
destiny = destiny + words1[BufStr];
i = i + 1;
continue;
}
BufStr = null;
BufStr = BufStr + InputStr[i];
if (words1.ContainsKey(BufStr))
{
destiny = destiny + words1[BufStr];
continue;
}
destiny = destiny + BufStr;
}
if (i == InputStr.Length - 3)
{
BufStr = null;
BufStr = BufStr + InputStr[i] + InputStr[i + 1] + InputStr[i + 2];
if (words1.ContainsKey(BufStr))
{
destiny = destiny + words1[BufStr];
i = i + 3;
}
}
if (i == InputStr.Length - 2)
{
BufStr = null;
BufStr = BufStr + InputStr[i] + InputStr[i + 1];
if (words1.ContainsKey(BufStr))
{
destiny = destiny + words1[BufStr];
i = i + 2;
}
}
while (i < InputStr.Length)
{
BufStr = null;
BufStr = BufStr + InputStr[i];
if (words1.ContainsKey(BufStr))
destiny = destiny + words1[BufStr];
else
destiny = destiny + BufStr;
i = i + 1;
}
textBox4.Text = destiny;
}
Можно, но С# знаю как соседа VB.NET по .NET, так что код лучше проверить на предмет соответствия традициям языка.
Например в VB.NET допустимо собирать строку с символов другой, в C# первоначально этой же строке нужно присвоить саму себя, а потом уже символы другой строки. По этому присуствует обнуление строки BufStr ([i]BufStr = null;).
Товарищи нет ли у кого программы для транслитерации написанной на С++,Java,C#?Вот нашел в сети немного инфы что скажете?Как лучше сделать такую прогу? »[/q]
Уважаемый D.Y, пишите ссылку на источник, при копировании материалов.
А для всех остальных:
Assert.AreEqual("Rabota s kirilitsiei", "Работа с кирилицей".Unidecode());
выполнится без ошибок.
Так со всеми языками, исключая некоторые "экзотические".
Перевод по таблице уникода, правда, только в одну сторону.
Подробнее здесь:
http://usanov.net/1451-unidecode-sharp-ascii-transliteraciya-dlya-net
И источник на оригинал поста от D.Y:
http://usanov.net/748-transliteraciya-rus-2-lat-na-c
Вот что я имею но при вводе в текстбокс3 ничего не происходит не знаю почему ведь текст бокс4 должен отображать результат
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
Dictionary<char, string> words = new Dictionary<char, string>();
Dictionary<string, char> words1 = new Dictionary<string, char>();
public Form1()
{
InitializeComponent();
words.Add('а', "a");
words.Add('б', "b");
words.Add('в', "v");
words.Add('г', "g");
words.Add('д', "d");
words.Add('е', "e");
words.Add('ё', "yo");
words.Add('ж', "zh");
words.Add('з', "z");
words.Add('и', "i");
words.Add('й', "j");
words.Add('к', "k");
words.Add('л', "l");
words.Add('м', "m");
words.Add('н', "n");
words.Add('о', "o");
words.Add('п', "p");
words.Add('р', "r");
words.Add('с', "s");
words.Add('т', "t");
words.Add('у', "u");
words.Add('ф', "f");
words.Add('х', "h");
words.Add('ц', "c");
words.Add('ч', "ch");
words.Add('ш', "sh");
words.Add('щ', "sch");
words.Add('ъ', "j");
words.Add('ы', "i");
words.Add('ь', "j");
words.Add('э', "e");
words.Add('ю', "yu");
words.Add('я', "ya");
words1.Add("a", 'а');
words1.Add("b", 'б');
words1.Add("v", 'в');
words1.Add("g", 'г');
words1.Add("d", 'д');
words1.Add("e", 'е');
words1.Add("zh", 'ж');
words1.Add("z", 'з');
words1.Add("i", 'и');
words1.Add("j", 'й');
words1.Add("k", 'к');
words1.Add("l", 'л');
words1.Add("m", 'м');
words1.Add("n", 'н');
words1.Add("o", 'о');
words1.Add("p", 'п');
words1.Add("r", 'р');
words1.Add("s", 'с');
words1.Add("t", 'т');
words1.Add("u", 'у');
words1.Add("f", 'ф');
words1.Add("h", 'х');
words1.Add("c", 'ц');
words1.Add("ch", 'ч');
words1.Add("sh", 'ш');
words1.Add("yu", 'ю');
words1.Add("ya", 'я');
}
//Obratnaya transliteraciya
private void textBox3_TextChanged(object sender, EventArgs e)
{
string InputStr = textBox3.Text, BufStr = null, destiny = null;
int i = 0;
for (i = 0; i < InputStr.Length - 3; i++)
{
BufStr = null;
BufStr = BufStr + InputStr[i] + InputStr[i + 1] + InputStr[i + 2];
if (words1.ContainsKey(BufStr))
{
destiny = destiny + words1[BufStr];
i = i + 2;
continue;
}
BufStr = null;
BufStr = BufStr + InputStr[i] + InputStr[i + 1];
if (words1.ContainsKey(BufStr))
{
destiny = destiny + words1[BufStr];
i = i + 1;
continue;
}
BufStr = null;
BufStr = BufStr + InputStr[i];
if (words1.ContainsKey(BufStr))
{
destiny = destiny + words1[BufStr];
continue;
}
destiny = destiny + BufStr;
}
if (i == InputStr.Length - 3)
{
BufStr = null;
BufStr = BufStr + InputStr[i] + InputStr[i + 1] + InputStr[i + 2];
if (words1.ContainsKey(BufStr))
{
destiny = destiny + words1[BufStr];
i = i + 3;
}
}
if (i == InputStr.Length - 2)
{
BufStr = null;
BufStr = BufStr + InputStr[i] + InputStr[i + 1];
if (words1.ContainsKey(BufStr))
{
destiny = destiny + words1[BufStr];
i = i + 2;
}
}
while (i < InputStr.Length)
{
BufStr = null;
BufStr = BufStr + InputStr[i];
if (words1.ContainsKey(BufStr))
destiny = destiny + words1[BufStr];
else
destiny = destiny + BufStr;
i = i + 1;
}
textBox4.Text = destiny;
}
private void textBox4_TextChanged(object sender, EventArgs e)
{
}
private void textBox1_TextChanged_1(object sender, EventArgs e)
{
string source = textBox1.Text;
string destiny = null;
for (int i = 0; i < source.Length; i++)
{
if (words.ContainsKey(source[i]))
destiny = destiny + words[source[i]];
else
destiny = destiny + source[i];
}
System.Text.StringBuilder sb = new System.Text.StringBuilder(destiny);
for (int j = 0; j < sb.Length; j++)
{
if (System.Char.IsLower(sb[j]) == true)
sb[j] = System.Char.ToLower(sb[j]);
else if (System.Char.IsUpper(sb[j]) == true)
sb[j] = System.Char.ToUpper(sb[j]);
}
string corrected = sb.ToString();
textBox2.Text = corrected;
}
private void textBox2_TextChanged(object sender, EventArgs e)
{
}
}
}
Все уже разобрался виной всего оказалась банальная не внимательность.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.