Решал тут как-то микро-задачу по поиску логинов пользователей в домене, где почему-то не учитывается ФИО по-русски. Понадобилась транслитерация, в соответствии с определенными правилами. Странно, но сообразил далеко не сразу, видимо, старею :-(
Чтобы впредь не мучиться публикую функцию. Следует отметить, что обратное преобразовние из транслита в русский не возможно (ну или, по крайней мере очень сложно), поскольку буквы Мягкий знак и Твердый знак не транслителируются в используемых мною правилах транслитерации. Если по вашим правилам транслитерации эти знаки во что-то переводятся, тогда соответствие русского текста и транслита становится однозначным, соответственно, можно выполнить и обратное преобразование аналогичным же образом.
Чтобы впредь не мучиться публикую функцию. Следует отметить, что обратное преобразовние из транслита в русский не возможно (ну или, по крайней мере очень сложно), поскольку буквы Мягкий знак и Твердый знак не транслителируются в используемых мною правилах транслитерации. Если по вашим правилам транслитерации эти знаки во что-то переводятся, тогда соответствие русского текста и транслита становится однозначным, соответственно, можно выполнить и обратное преобразование аналогичным же образом.
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(); }Если есть у кого более прикольные варианты решения такой же задачи, пожалуйста, предлагайте.
1 comment:
В логинах не использую (апострофы)транслитерацию ГОСТ 7.79-2000, только в примечаниях или в других полях. А за функцию - спасибо
Post a Comment