Преобразование странных символов в строке в римские символы - PullRequest
2 голосов
/ 29 декабря 2010

Мне нужно иметь возможность преобразовывать вводимые пользователем символы только в [a-z] (только без учета регистра). Итак, меня интересуют только 26 символов.

Однако пользователь может вводить любую «форму» тех символов, которые ему нравятся. Испанский «n», французский «e» и немецкий «u» могут иметь акценты от пользовательского ввода (которые удаляются программой).

Я довольно близко подошел к этим двум методам расширения:

    public static string LettersOnly(this string Instring)
    {
        char[] aChar = Instring.ToCharArray();
        int intCount = 0;
        string strTemp = "";

        for (intCount = 0; intCount <= Instring.Length - 1; intCount++)
        {
            if (char.IsLetter(aChar[intCount]) )
            {
                strTemp += aChar[intCount];
            }
        }

        return strTemp;
    }

    public static string RemoveAccentMarks(this string s)
    {
        string normalizedString = s.Normalize(NormalizationForm.FormD);
        StringBuilder sb = new StringBuilder();

        char c;
        for (int i = 0; i <= normalizedString.Length - 1; i++)
        {
            c = normalizedString[i];
            if (System.Globalization.CharUnicodeInfo.GetUnicodeCategory(c) != System.Globalization.UnicodeCategory.NonSpacingMark)
            {
                sb.Append(c);
            }
        }

        return sb.ToString();
    }

Вот пример теста:

string input = "Àlièñ451";
input = input.LettersOnly().RemoveAccentMarks().ToLower();
console.WriteLine(input);

Результат: "alien" (как и ожидалось)

Это работает в 99,9% случаев. Однако несколько символов, кажется, проходят все проверки.

Например, "ß" (я думаю, немецкий двойник). .Net считает это письмом. Приведенная выше функция не учитывает наличие знаков акцента ... но ЕЩЕ НЕ находится в диапазоне a-z, как мне и нужно. В идеале я мог бы преобразовать это в «B» или «ss» (в зависимости от того, что подходит), но мне нужно преобразовать его в НЕЧТО в диапазоне от a до z.

Другой пример, бубен («" »). Опять же .Net считает это «письмом». Приведенная выше функция не видит акцента, но, опять же, ее нет в латинском 26-символьном алфавите. В этом случае мне нужно преобразовать в две буквы «ae» (я думаю).

Существует ли простой способ преобразовать ЛЮБОЙ во всем мире вход в эквивалент ближайшего римского алфавита? Ожидается, что это, вероятно, будет не совсем чистый перевод, но я должен верить, что на входах FlipScript.com ТОЛЬКО используются символы a-z ... и ничего больше.

Любая помощь приветствуется.

1 Ответ

3 голосов
/ 29 декабря 2010

Если бы я был на вашем месте, я бы создал словарь, который содержал бы сопоставления от иностранных букв к латинским буквам. Я бы использовал это по двум причинам:

  1. Это облегчит понимание того, что вы хотите сделать, тому, кто читает ваш код.
  2. Количество этих специальных букв ограничено, поэтому вам не нужно беспокоиться об обслуживании структуры данных.

Я бы поместил сопоставления в XML-файл, а затем загрузил их в структуру данных во время выполнения. Таким образом, вам не нужно изменять какой-либо код, который использует символы, вам нужно только указать сами сопоставления.

...