Гугл видимо не знает о реализации транслитерации на 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)
- 12 января 2012 -- Генерация строк перебором букв. (4)
- 23 сентября 2011 -- Конфигурационные секции. Web.config и App.config для «C# продолжающих». (0)
- 30 июля 2010 -- DLR 1.0 на примере IronPython 2.6 (0)
- 15 сентября 2011 -- C#: Запуск Windows сервисов как консольных приложений (5)
18 декабря, 2008 at 23:07
Следующий код переименует все файлы с расширением .txt и русскими символами в латиницу.
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
Спасибо, очень время сэкономил.
6 ноября, 2012 at 11:37
Переделал метод 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;
}
7 ноября, 2012 at 16:04
топорный метод. а поизящнее то никак?
11 июля, 2013 at 8:10
ребят а выложите пж исходник…
26 августа, 2013 at 7:25
Добрый день, уважаемый автор. Вы не против, если я запушу этот модуль на гит-хаб? Естественно, что я предварительно его почищу по своему усмотрению и добавлю рекомендации из обсуждения. Если не против, свяжитесь со мной пожалуйста по e-mail, который я тут указал, и я, конечно же, вышлю вам модуль на ревью предварительно.
3 сентября, 2013 at 20:31
Да, пожалуйста 🙂
28 мая, 2014 at 16:53
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 августа, 2014 at 23:45
Не очень хорошее решение: Replace, использование Dictiоnary для хранения и без поиска на конечном массиве (итератор там, вообще-то, дорогой), не происходит корректного перевода в случае перевода с транслита, не учитывается регистр соседних букв (SHkola, например, вместо Shkola). Для игрушек и обучения подойдет, а вот где-то по серьезному использовать — нет.
11 ноября, 2015 at 15:41
Спасибо автору!