Картинка блога

Гугл видимо не знает о реализации транслитерации на C#. Следующий код взят из плагина Rus to Lat для WordPress.

Транслитерация переводит следующий текст
«Транслитерация русских символов английские» в
«Transliteraciya russkix simvolov v anglijskie»

Как и в плагине, предложенная транслитерация поддерживает два формата — ГОСТ 16876-71 и ISO 9-95.

UPD: Для одностороннего перевода в латиницу, за счет поддержки разных языков используем Unidecode Sharp.

Использование:

    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("—", "-");
        }
    }
}

Метки:, ,

22 комментария в “Транслитерация RUS 2 LAT на C#”

  1. Следующий код переименует все файлы с расширением .txt и русскими символами в латиницу.

                string[] files = Directory.GetFiles(Environment.CurrentDirectory, "*.txt");
                foreach (string fileName in files)
                {
                    File.Move(fileName, Transliteration.Front(Path.GetFileName(fileName)));
                    Console.WriteLine(Path.GetFileName(fileName));
                }
    
  2. Спасибо огромадное за этот класс. Очень помог!

  3. Пытался использовать этот класс, но при создание классы выходит ошибка, что
    «System.Collections.Generic.Dictionary» должно инициализироваться 2 переменными 🙁

  4. Да, вы правы.
    Просто HTML «съел» generiс типы.
    Должно быть
    private static Dictionary<string,string%gt; gost = new Dictionary<string,string%gt;(); //ГОСТ 16876-71
    private static Dictionary<string,string%gt; iso = new Dictionary<string,string%gt;(); //ISO 9-95

  5. Евгений
    26 мая, 2009 at 8:01

    Метод Front работает корректно. А вот методу Back не хватает лексического анализа. Достаточно заставить его перевести, например, фразу cheshskaya kukhnya (чешская кухня). Не запуская код, можно увидеть, что получим цhесhскаыа кукhныа.
    Но сам принцип построения класса мне понравился. Гибкий, масштабируемый, легкочитаемый. Я его положил в основу построения своего транслитератора. Автору большое спасибо.

  6. поскажите у меня не получается с
    private static Dictionary<string,string%gt; gost = new Dictionary<string,string%gt;(); //ГОСТ 16876-71
    private static Dictionary<string,string%gt; iso = new Dictionary<string,string%gt;(); //ISO 9-95

    ругается на % потом =
    незнаю что делать

  7. У вас везде пропущен ключевой момент с Dictionary — (начиная с циклов), переписали бы что ли в человеческий вид(а лучше архивом с проектом выложели).

  8. Вы знаете стоимость String.Replace? Это перебор всех символов сторки + создание новой с замененными символами.
    В общем подход output = output.Replace(key.Value, key.Key); в цикле — убийца перфоменса. Представьте строку в 1МБ…
    Лучше перебирать все символы одной строки, искать подходящие в транслите и апендить в новую строку через StringBuilder.

  9. Спасибо за помощь и информацию. Я учту пожелания, когда буду портировать unidecode

  10. Спасибо 🙂
    очень помогли!

  11. Спасибо большое и Человеческое

  12. Большое спасибо!!! Сэкономили мне время! Спасибо!

  13. Спасибо, очень время сэкономил.

  14. Переделал метод Front чтоб без реплейса, не пробовал со строкой в 1Мб, кого интересует перфоманс протестите:

    public static string Front(string text, TransliterationType type)
    {
    Dictionary[ЗнакМеньше]string, string[ЗнакБольше] tdict = GetDictionaryByType(type);
    string output = «»;
    StringBuilder sb = new StringBuilder(text);
    for (int i = 0; i < sb.Length; i++)
    {
    if (tdict.ContainsKey(sb[i].ToString()))
    output +=tdict[sb[i].ToString()];
    else output += sb[i].ToString();
    }

    return output;
    }

  15. топорный метод. а поизящнее то никак?

  16. ребят а выложите пж исходник…

  17. Добрый день, уважаемый автор. Вы не против, если я запушу этот модуль на гит-хаб? Естественно, что я предварительно его почищу по своему усмотрению и добавлю рекомендации из обсуждения. Если не против, свяжитесь со мной пожалуйста по e-mail, который я тут указал, и я, конечно же, вышлю вам модуль на ревью предварительно.

  18. Да, пожалуйста 🙂

  19. public enum TransliterationType
    {
    Gost,
    ISO
    }
    public static class Transliteration
    {
    private static readonly IDictionary Gost = new Dictionary(); //ГОСТ 16876-71
    private static readonly IDictionary 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)
    {
    var output = text;
    var tdict = GetDictionaryByType(type);

    return tdict.Aggregate(output, (current, key) => current.Replace(key.Key, key.Value));
    }
    public static string Back(string text)
    {
    return Back(text, TransliterationType.ISO);
    }
    public static string Back(string text, TransliterationType type)
    {
    var output = text;
    var tdict = GetDictionaryByType(type);

    return tdict.Aggregate(output, (current, key) => current.Replace(key.Value, key.Key));
    }

    private static IEnumerable<KeyValuePair> GetDictionaryByType(TransliterationType type)
    {
    var 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(«—», «-«);
    }
    }

  20. Не очень хорошее решение: Replace, использование Dictiоnary для хранения и без поиска на конечном массиве (итератор там, вообще-то, дорогой), не происходит корректного перевода в случае перевода с транслита, не учитывается регистр соседних букв (SHkola, например, вместо Shkola). Для игрушек и обучения подойдет, а вот где-то по серьезному использовать — нет.

  21. Спасибо автору!

Trackbacks/Pingbacks

  1. DIMAKA's BLOG : Транслитерация: кириллицу в латиницу на C#