Мне нужно иметь возможность преобразовывать вводимые пользователем символы только в [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 ... и ничего больше.
Любая помощь приветствуется.