13

我找到了如何在 stackoverflow 上删除变音符号的答案,但是您能否告诉我是否可以将变音符号更改为非变音符号?

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

4

5 回答 5

28

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

    // \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 的 3rd 方系统时,但您的数据是 unicode。这很常见。您的选择基本上是:删除重音字符,或尝试从重音字符中删除重音以尝试尽可能多地保留原始输入。显然,这不是一个完美的解决方案,但它比简单地删除 ascii 127 以上的任何字符要好 80%。

于 2010-07-22T23:25:27.277 回答
11

从我自己的答案复制到另一个问题:

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

这些表仍然存在,但现在是来自 Unicode 标准的表。

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

参考:

于 2008-12-01T16:21:49.510 回答
4

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

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

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

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

然而,自动化方法缺乏辨别力可能会产生一些意想不到的影响。我建议对有代表性的文本进行大量测试。

于 2008-12-01T16:22:02.973 回答
2

举个简单的例子:

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

string newString = myDiacriticsString.Normalize(NormalizationForm.FormD);
于 2009-01-07T15:00:29.403 回答
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();    
    }

希望能帮助到你。

于 2012-01-16T19:20:50.187 回答