【问题标题】:Converting "Bizarre" Chars in String to Roman Chars将字符串中的“奇异”字符转换为罗马字符
【发布时间】: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... 而没有其他任何内容。

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

【问题讨论】:

标签: c# algorithm special-characters


【解决方案1】:

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

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

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

【讨论】:

  • 好主意,大卫。困难在于找到映射。有什么想法吗?
  • 我会创建一个HashMap&lt;String, String&gt; map,其中的键是“奇异”字符,罗马对应的字符是值。例如:map.put("č", "c");
  • 听起来不错。我希望知道是否有人做过“映射”,但我应该能够从维基百科获得大部分我需要的东西。谢谢,大卫。已接受并 +1。
猜你喜欢
  • 2016-07-04
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 2019-10-10
相关资源
最近更新 更多