EDYCJA 2012-01-20: O rany! Rozwiązanie było o wiele prostsze i było w ramach prawie od zawsze. Jak zauważył knightpfhor :
string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
Oto funkcja, która usuwa znaki diakrytyczne z ciągu znaków:
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);
}
Więcej szczegółów na blogu MichKap ( RIP ... ).
Zasada jest taka, że zamienia „é” w 2 kolejne znaki „e”, ostre. Następnie dokonuje iteracji przez znaki i pomija znaki diakrytyczne.
„héllo” staje się „he <acute> llo”, co z kolei staje się „hello”.
Debug.Assert("hello"==RemoveDiacritics("héllo"));
Uwaga: oto bardziej kompaktowa, przyjazna dla platformy .NET4 + wersja tej samej funkcji:
static string RemoveDiacritics(string text)
{
return string.Concat(
text.Normalize(NormalizationForm.FormD)
.Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch)!=
UnicodeCategory.NonSpacingMark)
).Normalize(NormalizationForm.FormC);
}
string.Normalize
?Jeśli nie musisz konwertować ciągu i chcesz po prostu sprawdzić równość, możesz użyć
lub jeśli chcesz, aby porównanie również nie uwzględniało wielkości liter
źródło
Poniższa metoda
CompareIgnoreAccents(...)
działa na przykładowych danych. Oto artykuł, w którym uzyskałem informacje ogólne : http://www.codeproject.com/KB/cs/EncodingAccents.aspxMyślę, że metoda rozszerzenia byłaby lepsza:
Wtedy zastosowanie byłoby takie:
źródło
Musiałem zrobić coś podobnego, ale z metodą StartsWith. Oto proste rozwiązanie pochodzące z @Serge - appTranslator.
Oto metoda rozszerzenia:
A dla jednego maniaków liniowców;)
Akcenty nieuwzględniające znaków i wielkości liter zaczynają się w ten sposób
źródło
Prostszy sposób na usunięcie akcentów:
źródło
spróbuj tego przeciążenia w metodzie String.Compare.
Metoda String.Compare (String, String, Boolean, CultureInfo)
Tworzy wartość int na podstawie operacji porównania, w tym cultureinfo. przykład na stronie porównuje „Zmiana” w językach en-US i en-CZ. CH w en-CZ to pojedyncza „litera”.
przykład z linku
dlatego w przypadku języków akcentowanych będziesz musiał pobrać kulturę, a następnie przetestować na jej podstawie napisy.
http://msdn.microsoft.com/en-us/library/hyxc48dt.aspx
źródło