将字符串中的“奇异”字符转换为罗马字符

我需要能够将用户输入转换为[az]罗马字符(不区分大小写)。 所以,我感兴趣的只有26个字符。

但是,用户可以键入他们希望的那些字符的任何“forms”。 西class牙语“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认为是一封信。 上面的函数不认为这有任何重音标记……但它仍然不在az的范围内,就像我需要的那样。 理想情况下,我可以将其转换为“B”或“ss”(取决于哪个),但我需要将其转换为az范围内的SOMETHING。

另一个例子,dipthong(“æ”)。 同样,.Net认为这是一封“信件”。 上面的function没有看到任何重音,但同样,它不是罗马26字符字母表。 在这种情况下,我需要转换为两个字母“ae”(我认为)。

有没有一种简单的方法可以将任何全球输入转换为最接近的罗马字母等效? 预计这可能不是一个非常干净的翻译,但我需要相信FlipScript.com上的输入只能获得字符az ……而不是别的。

任何和所有帮助赞赏。

如果我是你,我会创建一个包含从外国字母到罗马字母的映射的字典。 我使用它有两个原因:

  1. 它将使您正在阅读代码的人更容易理解您想要做的事情。
  2. 这些特殊字母数量有限,有限,因此您无需担心数据结构的维护。

我将映射放入xml文件,然后在运行时将它们加载到数据结构中。 这样,您不需要修改任何使用字符的代码,您只需要指定映射本身。