Как конвертировать русские буквы и спецсимволы в латинский/английский алфавит
Периодически возникает необходимость заменить некоторые спец символы или диакритические знаки (акценты) присутствующие в различных языках на латинские/английские буквы.
Например:
русская буква Ё сконвертируется в Yo
немецкая ß в результате станет SS
румынская Ş в результате станет S и тд.
Нижеприведенный метод можно дополнять/изменять в зависимости от поставленных задач.
Данный код конвертирует весь текст целиком, учитывая регистр всех букв.
public static str RussianAndNonLatin2Latin(str _text)
{
// Т.к. аксапта не чувствительна к регистру, то перевод всего текста в строчные символы нам понадобится ниже для определения заглавных букв.
str textLower = strLwr(_text);
str retText;
str letter;
str letterLower;
int position;
boolean isCapital;
// Локальный метод, преобразующий символ в латиницу
str convert2Latin(str _char, boolean _isCapital = false)
{
str ret;
if (!strAlpha(_char)) return _char;
else if (strFind("äæǽ", _char, 0, 30)) ret = "Ae";
else if (strFind("öœ", _char, 0, 30)) ret = "Oe";
else if (strFind("ü", _char, 0, 30)) ret = "Ue";
else if (strFind("Ä", _char, 0, 30)) ret = "Ae";
else if (strFind("Ü", _char, 0, 30)) ret = "Ue";
else if (strFind("Ö", _char, 0, 30)) ret = "Oe";
else if (strFind("ÀÁÂÃÄÅǺĀĂĄǍΑΆẢẠẦẪẨẬẰẮẴẲẶА", _char, 0, 30)) ret = "A";
else if (strFind("àáâãåǻāăąǎªαάảạầấẫẩậằắẵẳặа", _char, 0, 30)) ret = "A";
else if (strFind("Б", _char, 0, 30)) ret = "B";
else if (strFind("ÇĆĈĊČ", _char, 0, 30)) ret = "C";
else if (strFind("Д", _char, 0, 30)) ret = "D";
else if (strFind("ÐĎĐΔðďđδ", _char, 0, 30)) ret = "Dj";
else if (strFind("ÈÉÊËĒĔĖĘĚΕΈẼẺẸỀẾỄỂỆЕЭ", _char, 0, 30)) ret = "E";
else if (strFind("èéêëēĕėęěέεẽẻẹềếễểệеэ", _char, 0, 30)) ret = "E";
else if (strFind("Ф", _char, 0, 30)) ret = "F";
else if (strFind("ĜĞĠĢΓГҐĝğġģγгґ", _char, 0, 30)) ret = "G";
else if (strFind("ĤĦĥħ", _char, 0, 30)) ret = "H";
else if (strFind("ÌÍÎÏĨĪĬǏĮİΗΉΊΙΪỈỊИЫ", _char, 0, 30)) ret = "I";
else if (strFind("ìíîïĩīĭǐįıηήίιϊỉịиыї", _char, 0, 30)) ret = "I";
else if (strFind("Ĵĵ", _char, 0, 30)) ret = "J";
else if (strFind("ĶΚК", _char, 0, 30)) ret = "K";
else if (strFind("ĹĻĽĿŁΛЛ", _char, 0, 30)) ret = "L";
else if (strFind("ĺļľŀłλл", _char, 0, 30)) ret = "L";
else if (strFind("М", _char, 0, 30)) ret = "M";
else if (strFind("ÑŃŅŇΝН", _char, 0, 30)) ret = "N";
else if (strFind("ñńņňʼnνн", _char, 0, 30)) ret = "N";
else if (strFind("ÒÓÔÕŌŎǑŐƠØǾΟΌΩΏỎỌỒỐỖỔỘỜỚỠỞỢО", _char, 0, 30)) ret = "O";
else if (strFind("òóôõōŏǒőơøǿºοόωώỏọồốỗổộờớỡởợо", _char, 0, 30))ret = "O";
else if (strFind("П", _char, 0, 30)) ret = "P";
else if (strFind("ŔŖŘΡРŕŗřρр", _char, 0, 30)) ret = "R";
else if (strFind("ŚŜŞȘŠΣС", _char, 0, 30)) ret = "S";
else if (strFind("śŝşșšſσςс", _char, 0, 30)) ret = "S";
else if (strFind("ȚŢŤŦτТ", _char, 0, 30)) ret = "T";
else if (strFind("țţťŧт", _char, 0, 30)) ret = "T";
else if (strFind("ÙÚÛŨŪŬŮŰŲƯǓǕǗǙǛŨỦỤỪỨỮỬỰУ", _char, 0, 30)) ret = "U";
else if (strFind("ùúûũūŭůűųưǔǖǘǚǜυύϋủụừứữửựу", _char, 0, 30)) ret = "U";
else if (strFind("ÝŸŶΥΎΫỲỸỶỴЙ", _char, 0, 30)) ret = "Y";
else if (strFind("ýÿŷỳỹỷỵй", _char, 0, 30)) ret = "Y";
else if (strFind("В", _char, 0, 30)) ret = "V";
else if (strFind("Ŵ", _char, 0, 30)) ret = "W";
else if (strFind("ŵ", _char, 0, 30)) ret = "W";
else if (strFind("ŹŻŽΖЗ", _char, 0, 30)) ret = "Z";
else if (strFind("źżžζз", _char, 0, 30)) ret = "Z";
else if (strFind("ÆǼ", _char, 0, 30)) ret = "Ae";
else if (strFind("ß", _char, 0, 30)) ret = "Ss";
else if (strFind("IJ", _char, 0, 30)) ret = "IJ";
else if (strFind("ij", _char, 0, 30)) ret = "Ij";
else if (strFind("Œ", _char, 0, 30)) ret = "Oe";
else if (strFind("ƒ", _char, 0, 30)) ret = "F";
else if (strFind("ξ", _char, 0, 30)) ret = "Ks";
else if (strFind("π", _char, 0, 30)) ret = "P";
else if (strFind("β", _char, 0, 30)) ret = "V";
else if (strFind("μ", _char, 0, 30)) ret = "M";
else if (strFind("ψ", _char, 0, 30)) ret = "Ps";
else if (strFind("Ёё", _char, 0, 30)) ret = "Yo";
else if (strFind("Єє", _char, 0, 30)) ret = "Ye";
else if (strFind("Ї", _char, 0, 30)) ret = "Yi";
else if (strFind("Жж", _char, 0, 30)) ret = "Zh";
else if (strFind("Хх", _char, 0, 30)) ret = "Kh";
else if (strFind("Цц", _char, 0, 30)) ret = "Ts";
else if (strFind("Чч", _char, 0, 30)) ret = "Ch";
else if (strFind("Шш", _char, 0, 30)) ret = "Sh";
else if (strFind("Щщ", _char, 0, 30)) ret = "Shch";
else if (strFind("ЪъЬь", _char, 0, 30)) ret = "";
else if (strFind("Юю", _char, 0, 30)) ret = "Yu";
else if (strFind("Яя", _char, 0, 30)) ret = "Ya";
else ret = _char;
return !_isCapital ? strLwr(ret) : ret;
}
;
for (position = 1; position <= strLen(_text); position++)
{
letterLower = subStr(textLower, position, 1);
letter = subStr(_text, position, 1);
letter = convert2Latin(letter, strCmp(letter, letterLower)); // strCmp() - регистрозависимая функция. Вернет 0 - если текст идентичен. 1 - если буквы в разных регистрах. -1 - если текст разный
retText += letter;
}
return retText;
}
Пример использования:
static void JobTestRussianAndNonLatin2Latin(Args _args)
{
str text1 = "А не пойти ли нам покодить в аксапте?";
str text2 = "Адрес в Риге: Vienības gatvE 11, Zemgales priekšpilsēta, Rīga";
;
info(ClassName::RussianAndNonLatin2Latin(text1)); // Результат: A ne poyti li nam pokodit v aksapte?
info(ClassName::RussianAndNonLatin2Latin(text2)); // Результат: Adres v Rige: Vienibas gatvE 11, Zemgales priekspilseta, Riga
}
Наиболее обсуждаемые: