Как конвертировать русские буквы и спецсимволы в латинский/английский алфавит

Периодически возникает необходимость заменить некоторые спец символы или диакритические знаки (акценты) присутствующие в различных языках на латинские/английские буквы.

Например:
русская буква Ё сконвертируется в 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
}

 

Комментариев нет


Добавить комментарий