我的应用程序需要处理可以包含重音字符的字符串。我需要能够将这些名称分组到不同字母的存储桶中。
本来想在.Net中使用CultureInvariant字符串比较,但是这样做有两个问题:
它实际上不会说字母 C 与 C cedilla 相同,但我需要这种相等性。
WinRT 的 .Net 版本在任何地方都没有 CultureInvariant 作为选项。
任何人都可以建议一种算法或至少一个起点,我可以用来尝试将不同的字母组合在一起吗?
谢谢。
我的应用程序需要处理可以包含重音字符的字符串。我需要能够将这些名称分组到不同字母的存储桶中。
本来想在.Net中使用CultureInvariant字符串比较,但是这样做有两个问题:
它实际上不会说字母 C 与 C cedilla 相同,但我需要这种相等性。
WinRT 的 .Net 版本在任何地方都没有 CultureInvariant 作为选项。
任何人都可以建议一种算法或至少一个起点,我可以用来尝试将不同的字母组合在一起吗?
谢谢。
有一个代码(由 Michael S. Kaplan 创建并在很多帖子中提到)在大多数情况下都可以解决问题:
static string RemoveDiacritics(string stIn)
{
string stFormD = stIn.Normalize(NormalizationForm.FormD);
StringBuilder sb = new StringBuilder();
for (int ich = 0; ich < stFormD.Length; ich++)
{
UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]);
if (uc != UnicodeCategory.NonSpacingMark)
{
sb.Append(stFormD[ich]);
}
}
return (sb.ToString().Normalize(NormalizationForm.FormC));
}
我用 Ç/C 和带/不带重音的字母对其进行了测试,并且工作正常(即使使用撇号)。在任何情况下,您可能都必须使用基于字典的方法或一组条件/switch...case 来补充这一点,以考虑所有可能的可能性。例如:
if (inputString.Contains("ß"))
{
inputString = inputString.Replace("ß", "ss");
}
这篇文章,WinRT 中有 String.Normalize() 替代方案吗?,有一个已标记为答案的解决方案。我还没有测试过,但是当我有的时候会在这里评论。