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

时间:2010-12-29 03:11:40

标签: c# algorithm special-characters

我需要能够将用户输入转换为[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范围内的SOMETHING。

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

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

任何和所有帮助表示赞赏。

1 个答案:

答案 0 :(得分:3)

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

  1. 这将使您更容易理解您想要阅读代码的人。
  2. 这些特殊字母数量少,数量有限,因此您无需担心数据结构的维护。
  3. 我将映射放入xml文件,然后在运行时将它们加载到数据结构中。这样,您不需要修改任何使用字符的代码,您只需要自己指定映射。