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

Гугл видимо не знает о реализации транслитерации на 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("—", "-");
        }
    }
}

Метки:, ,

14 комментариев в “Транслитерация 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. Спасибо, очень время сэкономил.

Trackbacks/Pingbacks

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>