Saturday, October 5, 2013

В транслит на C#

Решал тут как-то микро-задачу по поиску логинов пользователей в домене, где почему-то не учитывается ФИО по-русски. Понадобилась транслитерация, в соответствии с определенными правилами. Странно, но сообразил далеко не сразу, видимо, старею :-(

Чтобы впредь не мучиться публикую функцию. Следует отметить, что обратное преобразовние из транслита в русский не возможно (ну или, по крайней мере очень сложно), поскольку буквы Мягкий знак и Твердый знак не транслителируются в используемых мною правилах транслитерации. Если по вашим правилам транслитерации эти знаки во что-то переводятся, тогда соответствие русского текста и транслита становится однозначным, соответственно, можно выполнить и обратное преобразование аналогичным же образом.

private static string Tr(string s)
{
    string ret = "";
    string[] rus = {"А","Б","В","Г","Д","Е","Ё","Ж", "З","И","Й","К","Л","М", "Н",
          "О","П","Р","С","Т","У","Ф","Х", "Ц", "Ч", "Ш", "Щ",   "Ъ", "Ы","Ь"
          "Э","Ю", "Я" };
    string[] eng = {"A","B","V","G","D","E","E","ZH","Z","I","Y","K","L","M","N",
          "O","P","R","S","T","U","F","KH","TS","CH","SH","SHCH",null,"Y",null,
          "E","YU","YA"};

    for (int j=0; j < s.Length; j++)
        for (int i = 0; i < rus.Length; i++)
            if (s.Substring(j, 1) == rus[i]) ret += eng[i];
     
    return ret;
}
 


Вариант, более быстрый на больших объемах (длинных строк транслитерации) и более щедящий к расходу памяти:
 
private static string Tr2(string s)
{
    StringBuilder ret = new StringBuilder();
    string[] rus = { "А", "Б", "В", "Г", "Д", "Е", "Ё", "Ж", "З", "И", "Й",
          "К", "Л", "М", "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц",   
          "Ч", "Ш", "Щ", "Ъ", "Ы", "Ь", "Э", "Ю", "Я" };
    string[] eng = { "A", "B", "V", "G", "D", "E", "E", "ZH", "Z", "I", "Y"
          "K", "L", "M", "N", "O", "P", "R", "S", "T", "U", "F", "KH", "TS",   
          "CH", "SH", "SHCH", null, "Y", null, "E", "YU", "YA" };

    for (int j = 0; j < s.Length; j++)
        for (int i = 0; i < rus.Length; i++)
            if (s.Substring(j, 1) == rus[i]) ret.Append(eng[i]);
    return ret.ToString();
}
        
Если есть у кого более прикольные варианты решения такой же задачи, пожалуйста, предлагайте.