Класс для транслитерации предложений на Русском по ГОСТ и ISO на C# под .NET Core
Бывает так, что приходится заниматься преобразованием предложения на русском в русский текст но на латинице (транслит), например при отправки СМС для сокращения затрат — поскольку латиницей обычно и влазит больше и стоит дешевле. Или при приведении ссылок для сайта в удобный вид без кириллицы, или просто для пересылки информации для решения проблем с кодировкой таким экзотическим способом, вариантов где это может пригодиться довольно много.
В этой публикации будет приведен пример класса который реализует функционал транслитерации в двух стандартах: ГОСТ и ISO. При желании, разобравшись в коде (он довольно прост и компактен) можно легко добавить и другие стандарты, но приведенные два мне кажутся наиболее используемыми.
Пример самого класса который реализует механизм транслитерации:
using System.Collections.Generic;
using System.Linq;
namespace Translit
{
public class TranslitMethods
{
public class Translitter
{
private List<TranslitSymbol> TranslitSymbols { get; set; }
/// <summary>
/// Метод транслитерации русского текста
/// </summary>
/// <param name="source">Исходная строка на русском</param>
/// <param name="type">Тип транслитерации, гост или ISO</param>
/// <returns></returns>
public string Translit(string source, TranslitType type)
{
var result = "";
for (var i = 0; i < source.Length; i++)
{
result = result +
(TranslitSymbols.FirstOrDefault(x => x.SymbolRus == source[i].ToString() && x.TranslitType==type) == null
? source[i].ToString()
: TranslitSymbols.First(x => x.SymbolRus == source[i].ToString() && x.TranslitType==type).SymbolEng);
}
return result;
}
// Конструктор - При создании заполняем справочники сопоставлений
public Translitter()
{
this.TranslitSymbols = new List<TranslitSymbol>();
var gost = "а:a,б:b,в:v,г:g,д:d,е:e,ё:jo,ж:zh,з:z,и:i,й:jj,к:k,л:l,м:m,н:n,о:o,п:p,р:r,с:s,т:t,у:u,ф:f,х:kh,ц:c,ч:ch,ш:sh,щ:shh,ъ:\",ы:y,ь:',э:eh,ю:ju,я:ja";
var iso = "а:a,б:b,в:v,г:g,д:d,е:e,ё:yo,ж:zh,з:z,и:i,й:j,к:k,л:l,м:m,н:n,о:o,п:p,р:r,с:s,т:t,у:u,ф:f,х:h,ц:c,ч:ch,ш:sh,щ:shh,ъ:\",ы:y,ь:',э:e,ю:yu,я:ya";
// Заполняем сопоставления по ГОСТ
foreach (string item in gost.Split(","))
{
string[] symbols = item.Split(":");
this.TranslitSymbols.Add(new TranslitSymbol
{
TranslitType = TranslitType.Gost,
SymbolRus = symbols[0].ToLower(),
SymbolEng = symbols[1].ToLower()
});
this.TranslitSymbols.Add(new TranslitSymbol
{
TranslitType = TranslitType.Gost,
SymbolRus = symbols[0].ToUpper(),
SymbolEng = symbols[1].ToUpper()
});
}
// Заполняем сопоставления по ISO
foreach (string item in iso.Split(","))
{
string[] symbols = item.Split(":");
this.TranslitSymbols.Add(new TranslitSymbol
{
TranslitType = TranslitType.Iso,
SymbolRus = symbols[0].ToLower(),
SymbolEng = symbols[1].ToLower()
});
this.TranslitSymbols.Add(new TranslitSymbol
{
TranslitType = TranslitType.Iso,
SymbolRus = symbols[0].ToUpper(),
SymbolEng = symbols[1].ToUpper()
});
}
}
}
// Перечисление типов транскрипций
public enum TranslitType
{
Gost,Iso
}
// Описание элемента справочника транскрипций
private class TranslitSymbol
{
public TranslitType TranslitType { get; set; }
public string SymbolRus { get; set; }
public string SymbolEng { get; set; }
}
}
}
Пример того как этот класс и метод Translit работают:
using System;
using Translit;
namespace Translit
{
class Program
{
static void Main(string[] args)
{
string val = "Точка доступа к нелинейной траектории прощупывается";
Console.WriteLine("Оригинал: "+val);
TranslitMethods.Translitter trn = new TranslitMethods.Translitter();
Console.WriteLine("ГОСТ: "+trn.Translit(val,TranslitMethods.TranslitType.Gost));
Console.WriteLine("ISO: "+trn.Translit(val,TranslitMethods.TranslitType.Iso));
Console.ReadKey();
}
}
}
Результат будет таким:
Оригинал: Точка доступа к нелинейной траектории прощупывается
ГОСТ: Tochka dostupa k nelinejjnojj traektorii proshhupyvaetsja
ISO: Tochka dostupa k nelinejnoj traektorii proshhupyvaetsya
Скачать исходник:
Скачать файл: translit.zip [56.31 Kb] (cкачиваний: 14)
Вот и всё.