Replacing characters in C# (ascii)
Others have commented on using a Unicode lookup table to remove Diacritics. I did a quick Google search and found this example. Code shamelessly copied, (re-formatted), and posted below:
using System;
using System.Text;
using System.Globalization;
public static class Remove
{
public 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));
}
}
So, your code could clean the input by calling:
line = Remove.RemoveDiacritics(line);
Don't know if it is useful but in an internal tool to write message on a led screen we have the following replacements (i'm sure that there are more intelligent ways to make this work for the unicode tables, but this one is enough for this small internal tool) :
strMessage = Regex.Replace(strMessage, "[éèëêð]", "e");
strMessage = Regex.Replace(strMessage, "[ÉÈËÊ]", "E");
strMessage = Regex.Replace(strMessage, "[àâä]", "a");
strMessage = Regex.Replace(strMessage, "[ÀÁÂÃÄÅ]", "A");
strMessage = Regex.Replace(strMessage, "[àáâãäå]", "a");
strMessage = Regex.Replace(strMessage, "[ÙÚÛÜ]", "U");
strMessage = Regex.Replace(strMessage, "[ùúûüµ]", "u");
strMessage = Regex.Replace(strMessage, "[òóôõöø]", "o");
strMessage = Regex.Replace(strMessage, "[ÒÓÔÕÖØ]", "O");
strMessage = Regex.Replace(strMessage, "[ìíîï]", "i");
strMessage = Regex.Replace(strMessage, "[ÌÍÎÏ]", "I");
strMessage = Regex.Replace(strMessage, "[š]", "s");
strMessage = Regex.Replace(strMessage, "[Š]", "S");
strMessage = Regex.Replace(strMessage, "[ñ]", "n");
strMessage = Regex.Replace(strMessage, "[Ñ]", "N");
strMessage = Regex.Replace(strMessage, "[ç]", "c");
strMessage = Regex.Replace(strMessage, "[Ç]", "C");
strMessage = Regex.Replace(strMessage, "[ÿ]", "y");
strMessage = Regex.Replace(strMessage, "[Ÿ]", "Y");
strMessage = Regex.Replace(strMessage, "[ž]", "z");
strMessage = Regex.Replace(strMessage, "[Ž]", "Z");
strMessage = Regex.Replace(strMessage, "[Ð]", "D");
strMessage = Regex.Replace(strMessage, "[œ]", "oe");
strMessage = Regex.Replace(strMessage, "[Œ]", "Oe");
strMessage = Regex.Replace(strMessage, "[«»\u201C\u201D\u201E\u201F\u2033\u2036]", "\"");
strMessage = Regex.Replace(strMessage, "[\u2026]", "...");
One thing to note is that if in most language the text is still understandable after such a treatment it's not always the case and will often force the reader to refer to the context of the sentence to be able to understand it. Not something you want if you have the choice.
Note that the correct solution would be to use the unicode tables, replacing characters with integrated diacritics with their "combined diacritical mark(s)"+character form and then removing the diacritics...
I often use an extenstion method based on the version Dana supplied. A quick explanation:
- Normalizing to form D splits charactes like è to an e and a nonspacing `
- From this, the nospacing characters are removed
- The result is normalized back to form D (I'm not sure if this is neccesary)
Code:
using System.Linq;
using System.Text;
using System.Globalization;
// namespace here
public static class Utility
{
public static string RemoveDiacritics(this string str)
{
if (str == null) return null;
var chars =
from c in str.Normalize(NormalizationForm.FormD).ToCharArray()
let uc = CharUnicodeInfo.GetUnicodeCategory(c)
where uc != UnicodeCategory.NonSpacingMark
select c;
var cleanStr = new string(chars.ToArray()).Normalize(NormalizationForm.FormC);
return cleanStr;
}
}