Гугл видимо не знает о реализации транслитерации на 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("—", "-");
}
}
}
Метки:C#, OpenSource, разработка
Похожие статьи
- 31 августа 2009 -- CRUD на SQLite (5)
- 23 сентября 2011 -- Конфигурационные секции. Web.config и App.config для «C# продолжающих». (0)
- 12 января 2012 -- Генерация строк перебором букв. (0)
- 30 июля 2010 -- DLR 1.0 на примере IronPython 2.6 (0)
- 15 сентября 2011 -- C#: Запуск Windows сервисов как консольных приложений (2)


18 декабря, 2008 at 23:07
Следующий код переименует все файлы с расширением .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)); }16 февраля, 2009 at 3:53
Спасибо огромадное за этот класс. Очень помог!
27 апреля, 2009 at 23:12
Пытался использовать этот класс, но при создание классы выходит ошибка, что
«System.Collections.Generic.Dictionary» должно инициализироваться 2 переменными
28 апреля, 2009 at 8:51
Да, вы правы.
Просто 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
26 мая, 2009 at 8:01
Метод Front работает корректно. А вот методу Back не хватает лексического анализа. Достаточно заставить его перевести, например, фразу cheshskaya kukhnya (чешская кухня). Не запуская код, можно увидеть, что получим цhесhскаыа кукhныа.
Но сам принцип построения класса мне понравился. Гибкий, масштабируемый, легкочитаемый. Я его положил в основу построения своего транслитератора. Автору большое спасибо.
27 сентября, 2009 at 22:17
поскажите у меня не получается с
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 января, 2010 at 20:04
У вас везде пропущен ключевой момент с Dictionary — (начиная с циклов), переписали бы что ли в человеческий вид(а лучше архивом с проектом выложели).
19 февраля, 2010 at 15:28
Вы знаете стоимость String.Replace? Это перебор всех символов сторки + создание новой с замененными символами.
В общем подход output = output.Replace(key.Value, key.Key); в цикле — убийца перфоменса. Представьте строку в 1МБ…
Лучше перебирать все символы одной строки, искать подходящие в транслите и апендить в новую строку через StringBuilder.
20 февраля, 2010 at 23:38
Спасибо за помощь и информацию. Я учту пожелания, когда буду портировать unidecode
1 марта, 2010 at 8:50
Спасибо
очень помогли!
1 марта, 2010 at 10:36
Спасибо большое и Человеческое
8 октября, 2011 at 21:05
Большое спасибо!!! Сэкономили мне время! Спасибо!
20 ноября, 2011 at 18:55
Спасибо, очень время сэкономил.