Ignoring accented letters in string comparison

FWIW, knightfor’s answer below (as of this writing) should be the accepted answer.

Here’s a function that strips diacritics from a string:

static string RemoveDiacritics(string text)
{
  string formD = text.Normalize(NormalizationForm.FormD);
  StringBuilder sb = new StringBuilder();

  foreach (char ch in formD)
  {
    UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(ch);
    if (uc != UnicodeCategory.NonSpacingMark)
    {
      sb.Append(ch);
    }
  }

  return sb.ToString().Normalize(NormalizationForm.FormC);
}

More details on MichKap’s blog (RIP…).

The principle is that is it turns ‘é’ into 2 successive chars ‘e’, acute.
It then iterates through the chars and skips the diacritics.

“héllo” becomes “he<acute>llo”, which in turn becomes “hello”.

Debug.Assert("hello"==RemoveDiacritics("héllo"));

Note: Here’s a more compact .NET4+ friendly version of the same function:

static string RemoveDiacritics(string text)
{
  return string.Concat( 
      text.Normalize(NormalizationForm.FormD)
      .Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch)!=
                                    UnicodeCategory.NonSpacingMark)
    ).Normalize(NormalizationForm.FormC);
}

Leave a Comment