如何将变音符号改为非变音符号

时间:2008-12-01 16:07:44

标签: .net replace character diacritics

我已经找到了如何在stackoverflow上删除变音字符的答案,但是请你告诉我是否可以将变音字符改为非变音字符?

哦..我想到.NET(或其他如果不可能的话)

5 个答案:

答案 0 :(得分:27)

由于没有人费心去发布代码来执行此操作,因此它是:

    // \p{Mn} or \p{Non_Spacing_Mark}: 
    //   a character intended to be combined with another 
    //   character without taking up extra space 
    //   (e.g. accents, umlauts, etc.). 
    private readonly static Regex nonSpacingMarkRegex = 
        new Regex(@"\p{Mn}", RegexOptions.Compiled);

    public static string RemoveDiacritics(string text)
    {
        if (text == null)
            return string.Empty;

        var normalizedText = 
            text.Normalize(NormalizationForm.FormD);

        return nonSpacingMarkRegex.Replace(normalizedText, string.Empty);
    }

注意:需要执行此操作的一个重要原因是当您要集成到仅执行ascii的第三方系统时,但您的数据是unicode。这很常见。您的选项基本上是:删除重音字符,或尝试从重音字符中删除重音以尝试尽可能多地保留原始输入。显然,这不是一个完美的解决方案,但它比简单地移除ascii 127上面的任何字符好80%。

答案 1 :(得分:10)

my own answer to another question复制:

  

您可以将文本转换为规范化形式D,而不是创建自己的表格,其中字符表示为基本字符加变音符号(例如,“á”将替换为“a”后跟一个结合急性口音)。然后,您可以删除所有非ASCII字母的内容。

     

表格仍然存在,但现在是Unicode标准的表格。

     

您还可以尝试NFKD而不是NFD,以捕获更多病例。

     

参考文献:

     

答案 2 :(得分:4)

退一步考虑为什么你想要这样做也可能是值得的。如果您尝试删除您认为无关紧要的字符差异,则应查看Unicode排序规则算法。这是在比较字符串进行搜索或排序时忽略案例或变音符号等差异的标准方法。

如果您计划显示修改后的文字,请考虑您的受众群体。您可以安全地过滤掉的是区域敏感。在美国英语中,“Igloo”=“igloo”,“resume”=“résumé”,但在土耳其语中,小写我是ı(无点),在法语中,cote表示引用,côté表示side,côte表示海岸。因此,整理语言决定了哪些差异是显着的。

如果删除变音符号是您的应用程序的正确解决方案,那么最安全地生成您自己的表格,您明确添加要转换的字符。

可以使用Unicode分解设计一般的自动化方法。通过这种方式,您可以将带有变音符号的字符分解为“组合”字符(变音符号)和它们组合的基本字符。过滤掉任何组合字符,你应该有“非变音”字符。

然而,自动化方法中缺乏歧视可能会产生一些意想不到的效果。我建议对代表性的文本进行大量测试。

答案 3 :(得分:2)

举个简单的例子:

从字符串中删除变音符号:

string newString = myDiacriticsString.Normalize(NormalizationForm.FormD);

答案 4 :(得分:0)

我的网站从外部来源输入数据,这些来源有许多奇怪的字符。我编写了以下C#函数来替换重音字符并使用正则表达式删除非美国键盘字符:

    using System.Text;
    using System.Text.RegularExpressions;

    internal static string SanitizeString(string source)
    {
        return Regex.Replace(source.Normalize(NormalizationForm.FormD), @"[^A-Za-z 0-9 \.,\?'""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*", string.Empty).Trim();    
    }

希望它有所帮助。