【问题标题】:How to replace special characters with their equivalent (such as " á " for " a") in C#?如何在 C# 中将特殊字符替换为等价字符(例如“á”代表“a”)?
【发布时间】:2011-01-24 12:47:12
【问题描述】:

我需要从 Excel 文件中获取葡萄牙语文本内容并创建一个 xml,该 xml 将由不支持诸如“ç”、“á”、“é”等字符的应用程序使用其他。而且我不能只删除字符,而是用它们的等效字符(例如“c”、“a”、“e”)替换它们。

我认为有比单独检查每个字符并用对应的字符替换它更好的方法。有什么建议吗?

【问题讨论】:

  • ç 和 c 不是“等价的”。
  • 它们是供人类阅读的,没有符号!

标签: c# string unicode encoding character


【解决方案1】:
string text = {text to replace characters in};

Dictionary<char, char> replacements = new Dictionary<char, char>();

// add your characters to the replacements dictionary, 
// key: char to replace
// value: replacement char

replacements.Add('ç', 'c');
...

System.Text.StringBuilder replaced = new System.Text.StringBuilder();
for (int i = 0; i < text.Length; i++)
{
    char character = text[i];
    if (replacements.ContainsKey(character))
    {
        replaced.Append(replacements[character]);
    }
    else
    {
        replaced.Append(character);
    }
}

// 'replaced' is now your converted text

【讨论】:

  • 虽然它是最简单的解决方案(也许不是最优雅的),但它完全可以满足您的需求。如果您创建了一个可重用的函数(带有静态替换列表)会更好。这种方法的一个缺点是您需要知道要替换的所有可能的字符,并且必须将大写和小写字符都添加到列表中(这可能需要一些试验和错误)。此外,您在复制 add 语句以创建新项目时可能会出错(例如忘记替换其中一个字符串),这可能会在发生错误时引起混乱。
【解决方案2】:

你可以试试

var decomposed = "áéö".Normalize(NormalizationForm.FormD);
var filtered = decomposed.Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark);
var newString = new String(filtered.ToArray());

这会从文本中分解重音符号,过滤它们并创建一个新字符串。组合变音符号属于Non spacing mark unicode 类别。

【讨论】:

  • 嗨,Ben,感谢您的 sn-p,但它不能很好地处理字符 Ł 和 ł(保持原样而不是更改为 L 和 l)。
  • 它对 æ 也没有任何作用。
【解决方案3】:

为了将来参考,这正是我最终得到的:

temp = stringToConvert.Normalize(NormalizationForm.FormD);
            IEnumerable<char> filtered = temp;
            filtered = filtered.Where(c => char.GetUnicodeCategory(c) != System.Globalization.UnicodeCategory.NonSpacingMark);
            final = new string(filtered.ToArray());

【讨论】:

    【解决方案4】:

    此解决方案的性能更好:

    string test = "áéíóúç";
    
    string result = Regex.Replace(test .Normalize(NormalizationForm.FormD), "[^A-Za-z| ]", string.empty);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-26
      • 2012-12-03
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      相关资源
      最近更新 更多