我的应用需要处理可以包含重音字符的字符串。我需要能够将这些名称分组到不同字母表中的桶中。
我最初想过在.Net中使用CultureInvariant字符串比较,但是有两个问题:
实际上并不是说字母C与C cedilla相同,但我需要相等。
WinRT的.Net版本在任何地方都没有CultureInvariant作为选项。
任何人都可以建议一个算法或至少一个起点,我可以尝试将不同的字母组合在一起吗?
感谢。
答案 0 :(得分:0)
有一个code(由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和带/不带重音的字母测试它并且工作正常(即使有撇号)。在任何情况下,您可能必须使用基于字典的方法或使用一组条件/开关...案例来补充这一点,以说明所有可能的可能性。例如:
if (inputString.Contains("ß"))
{
inputString = inputString.Replace("ß", "ss");
}
答案 1 :(得分:0)
这篇文章Is there String.Normalize() alternative in WinRT?有一个标记为答案的解决方案。我没有测试过,但是当我有这个时会在这里发表评论。