【发布时间】:2010-12-29 03:11:40
【问题描述】:
我只需要能够将用户输入转换为 [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% 的情况。但是,有几个角色似乎通过了所有检查。
例如,“ß”(我认为是德语双 s)。 .Net 认为这是一封信。上面的函数不认为这有任何重音符号......但它仍然不在 a-z 的范围内,就像我需要的那样。理想情况下,我可以将其转换为“B”或“ss”(以合适的为准),但我需要将其转换为 a-z 范围内的 SOMETHING。
另一个例子,双元音(“æ”)。同样,.Net 认为这是一封“信”。上面的函数看不到任何重音,但同样,它不在罗马 26 字符字母表中。在这种情况下,我需要转换为两个字母“ae”(我认为)。
有没有一种简单的方法可以将任何全球输入转换为最接近的罗马字母等效项?预计这可能不会是一个完全干净的翻译,但我需要相信 FlipScript.com 上的输入只会得到字符 a-z... 而没有其他任何内容。
任何和所有帮助表示赞赏。
【问题讨论】:
-
这里是前南斯拉夫国家使用的额外字母 čćđšž whitch。
-
很棒的文章和 cmets,但我已经能够删除重音符号,而且效果很好。但是,这些解决方案都不会处理“große”的输入(例如)。我什至不确定正确的罗马等价物是什么(粗俗?格罗布?)
-
粗略。每当eszett (ß) 字符不可用时,它就会被 ss 替换。
标签: c# algorithm special-characters