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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Транслитерация на С++, Java, C#.

Ответить
Настройки темы
Разное - Транслитерация на С++, Java, C#.

Аватара для D.Y.

Новый участник


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

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


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

Отправлено: 21:20, 09-03-2010

 

Ветеран


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

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


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
Словарь, в своё время, взят отсюда
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:58, 09-03-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для D.Y.

Новый участник


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

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


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

Отправлено: 23:22, 09-03-2010 | #3


Ветеран


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

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


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.

Отправлено: 23:31, 09-03-2010 | #4


Аватара для D.Y.

Новый участник


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

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


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

Отправлено: 08:15, 10-03-2010 | #5


Аватара для D.Y.

Новый участник


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

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


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

Отправлено: 23:30, 01-05-2010 | #6


Ветеран


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

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


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

Отправлено: 23:38, 01-05-2010 | #7


Аватара для D.Y.

Новый участник


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

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


Есть вот такой вариант транслитерации но у меня почему то не отображает текст во втором "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., 02-05-2010 в 18:08. Причина: не закрытый тег


Отправлено: 18:05, 02-05-2010 | #8


Ветеран


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

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


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[i]))
                    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('а', "a"); вместо words.Add("а", "a");.
Это сообщение посчитали полезным следующие участники:

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


Аватара для D.Y.

Новый участник


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

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


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

Код: Выделить весь код
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;
        }
    }
}
Сейчас ломаю голову нед обратной транслитерацией точнее над Ж,Ч,Ш,Щ,Я,Ю и тд. Может есть идеи.

Отправлено: 22:28, 06-05-2010 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Транслитерация на С++, Java, C#.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Проблемы с java(java runtime environment) KOLANICH Microsoft Windows 2000/XP 1 15-03-2008 08:00
[решено] JS. Обратная транслитерация. VeshchiyOleg Вебмастеру 1 27-01-2007 21:00
То ли Java, то ли... ??? Guest Сетевые технологии 8 20-12-2003 17:19
Java - Java DYURIK Программирование и базы данных 2 28-09-2003 04:45
JAVA в XP FANTOMAS Microsoft Windows 2000/XP 6 12-10-2002 14:06




 
Переход