Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Транслитерация на С++, Java, C#. (http://forum.oszone.net/showthread.php?t=169643)

D.Y. 09-03-2010 21:20 1364714

Транслитерация на С++, 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("—", "-");
        }
    }
}


Admiral 09-03-2010 22:58 1364798

D.Y. есть на VB.NET (выполнена в виде консольной программы), перенести на C# думаю проблем не составит.
А если всё же будет составлять, то для этих .NET языков есть конвертор
Код:

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

Словарь, в своё время, взят отсюда

D.Y. 09-03-2010 23:22 1364824

Хороший пример, но возможно придется переделать немного(дописать нижний регистр) ведь здесь нет учета регистра.Я думаю что так будет правильнее.

Admiral 09-03-2010 23:31 1364834

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. 10-03-2010 08:15 1364995

прошу прощения не заметил.

D.Y. 01-05-2010 23:30 1404930

А как можно сделать обратную транслитерацию снова использовать массивы или есть какая нибудь функция ?

Admiral 01-05-2010 23:38 1404932

D.Y., если на VB.NET то готовой функции нету.
Да можно воспользоваться словарём.
Для некоторых букв (.Add("Ъ", "'"), .Add("Ь", "'")) или предлагать пользователю при распознании варианты, или самостоятельно в программе анализировать (по частоте использования в языке или более сложный вариант - по грамматическим правилам).
Буквы транслирующие в несколько (.Add("Ж", "Zh"), .Add("Ц", "Ts"), .Add("Ч", "Ch"), .Add("Ш", "Sh"), .Add("Щ", "Sch")) - заслуживают отдельной обратной транслитерации.

D.Y. 02-05-2010 18:05 1405276

Есть вот такой вариант транслитерации но у меня почему то не отображает текст во втором "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)
        {

        }
    }
}


Admiral 05-05-2010 01:05 1406858

D.Y., не знакома конструкция - KeyValuePair&lt;string, string&gt; 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 &lt; source.Length; i++)
            {
                if (words.ContainsKey(source[i]))
                    destiny = destiny + words[source[i]];
                else
                    destiny = destiny + source[i];
            }
            textBox2.Text = destiny;
        }

словарь объявил как Dictionary&lt;char, string&gt; words = new Dictionary&lt;char, string&gt;();.
В этом случаи в C#, в отличии от VB.NET, сами буквы должны быть заключены в одинарные кавычки (на примере первой буквы - words.Add('а', "a"); вместо words.Add("а", "a");.

D.Y. 06-05-2010 22:28 1408324

Вот я немного переделал программу добавив проверку регистра тем самым избавив ее от избыточности

Код:

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;
        }
    }
}

Сейчас ломаю голову нед обратной транслитерацией точнее над Ж,Ч,Ш,Щ,Я,Ю и тд. Может есть идеи.

Admiral 07-05-2010 01:56 1408397

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 &amp; st &amp; " "
        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) &amp; InputStr(i + 1) &amp; InputStr(i + 2)
            If Translit2Cyrillic.ContainsKey(BufStr) Then
                Console.Write(Translit2Cyrillic(BufStr))
                i = i + 2
                Continue For
            End If
            BufStr = InputStr(i) &amp; 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) &amp; InputStr(i + 1) &amp; 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) &amp; InputStr(i + 1)
            If Translit2Cyrillic.ContainsKey(BufStr) Then
                Console.Write(Translit2Cyrillic(BufStr))
                i = i + 2
            End If
        End If
        While i &lt; 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

Перенести на С# и добавить распознавание регистра думаю проблем не составит.

D.Y. 07-05-2010 16:32 1408762

Если честно то проблемы с преобразованием возникли в 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.

Admiral 07-05-2010 22:15 1408979

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 &lt; 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 &lt; 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 (BufStr = null;).

ikutsin 07-05-2010 22:25 1408985

Товарищи нет ли у кого программы для транслитерации написанной на С++,Java,C#?Вот нашел в сети немного инфы что скажете?Как лучше сделать такую прогу? »[/q]

Уважаемый D.Y, пишите ссылку на источник, при копировании материалов.
А для всех остальных:

Код:

Assert.AreEqual("Rabota s kirilitsiei", "Работа с кирилицей".Unidecode());
выполнится без ошибок.

Так со всеми языками, исключая некоторые "экзотические".
Перевод по таблице уникода, правда, только в одну сторону.

Подробнее здесь:
http://usanov.net/1451-unidecode-sha...aciya-dlya-net

И источник на оригинал поста от D.Y:
http://usanov.net/748-transliteraciya-rus-2-lat-na-c

D.Y. 07-05-2010 23:51 1409035

Вот что я имею но при вводе в текстбокс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)
        {

        }
   
    }

}


D.Y. 14-05-2010 13:16 1413168

Все уже разобрался виной всего оказалась банальная не внимательность.


Время: 13:10.

Время: 13:10.
© OSzone.net 2001-