我需要能够将用户输入仅转换为 [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);
Result: "alien"
(如预期)
这适用于 99.9% 的情况。然而,有几个角色似乎通过了所有的检查。
例如,“ß”(我认为是德语的双 s)。 .Net 将其视为一封信。上面的函数不认为它有任何重音符号...但它仍然不在 a-z 的范围内,就像我需要的那样。理想情况下,我可以将其转换为“B”或“ss”(以合适者为准),但我需要将其转换为 a-z 范围内的内容。
另一个例子,双元音(“æ”)。同样,.Net 认为这是一封“信件”。上面的函数看不到任何重音符号,但同样,它不在罗马 26 个字符字母表中。在这种情况下,我需要转换为两个字母“ae”(我认为)。
有没有一种简单的方法可以将任何全球输入转换为最接近的罗马字母等效项?预计这可能不会是一个完全干净的翻译,但我需要相信 FlipScript.com 的输入仅获取字符 a-z... 而没有其他内容。
任何和所有的帮助表示赞赏。
如果我是你,我会创建一个字典,其中包含从外文字母到罗马字母的映射。我使用它有两个原因:
- 这将使阅读您代码的人更容易理解您想要做什么。
- 这些特殊字母的数量很小且有限,因此您无需担心数据结构的维护。
我将映射放入 xml 文件中,然后在运行时将它们加载到数据结构中。这样,您不需要修改任何使用字符的代码,您只需要指定映射本身。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)