O varianta destul de simpla la aceasta problema este sa normalizam tot textul spre caractere ascii base. In acest caz de exemplu 'ț' o sa devina 't'.
Acest lucru se face destul de simplu folosind metoda Normalize, făcând o descompunere canonica a textului.
string normalizeText = sourceText.Normalize(Normalize.FormD);
Trebuie sa avem grija la unele semne de legatura precum 'ß', pentru care trebuie sa facem manual transformarea( dacă dorim).
Mai jos gasiti implementarea pe care eu o propun:
private static readonly char[] SplitChars;
private static readonly Dictionary<char, char> SpecialChars;
static Constructor()
{
SpecialChars = new Dictionary<char, char>();
SpecialChars.Add('ß', 's');
SplitChars = new[] { ' ', '"', '\'', '`', '"', '-', ',', '.' };
}
private string ConvertToBaseASCII(string text)
{
var normalize = text
.ToLowerInvariant()
.Normalize(NormalizationForm.FormD)
.Split(SplitChars, StringSplitOptions.RemoveEmptyEntries);
StringBuilder sb = new StringBuilder();
foreach (string item in normalize)
{
foreach (var c in item)
{
UnicodeCategory unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
if (SpecialChars.Keys.Contains(c))
{
sb.Append(SpecialChars[c]);
continue;
}
if (unicodeCategory != UnicodeCategory.NonSpacingMark)
{
sb.Append(c);
}
}
}
return sb.ToString().Normalize(NormalizationForm.FormC);
}
0 comments:
Post a Comment