Разное - Транслитерация на С++, Java, C#.

Аватара пользователя
D.Y.

Разное - Транслитерация на С++, Java, C#.

Сообщение D.Y. »

Товарищи нет ли у кого программы для транслитерации написанной на С++,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

Re: Разное - Транслитерация на С++, Java, C#.

Сообщение Admiral »

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

Словарь, в своё время, взят
[архив - Часть 2] AutoIt скрипты
Аватара пользователя
Admiral

Re: Разное - Транслитерация на С++, Java, C#.

Сообщение Admiral »

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

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

Re: Разное - Транслитерация на С++, Java, C#.

Сообщение D.Y. »

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

Re: Разное - Транслитерация на С++, Java, C#.

Сообщение D.Y. »

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.

Re: Разное - Транслитерация на С++, Java, C#.

Сообщение D.Y. »

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

Re: Разное - Транслитерация на С++, Java, C#.

Сообщение D.Y. »

D.Y., если на VB.NET то готовой функции нету.

Да можно воспользоваться словарём.

Для некоторых букв (.Add("Ъ", "'"), .Add("Ь", "'")) или предлагать пользователю при распознании варианты, или самостоятельно в программе анализировать (по частоте использования в языке или более сложный вариант - по грамматическим правилам).

Буквы транслирующие в несколько (.Add("Ж", "Zh"), .Add("Ц", "Ts"), .Add("Ч", "Ch"), .Add("Ш", "Sh"), .Add("Щ", "Sch")) - заслуживают отдельной обратной транслитерации.
Аватара пользователя
D.Y.

Re: Разное - Транслитерация на С++, Java, C#.

Сообщение D.Y. »

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

Re: Разное - Транслитерация на С++, Java, C#.

Сообщение Admiral »

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

словарь объявил как Dictionary words = new Dictionary();[/i].

В этом случаи в C#, в отличии от VB.NET, сами буквы должны быть заключены в одинарные кавычки (на примере первой буквы - words.Add('а', "a"); вместо words.Add("а", "a");.
Ответить

Вернуться в «Программирование и базы данных»