EDIT 20-01-2012: Oh garoto! A solução era muito mais simples e está na estrutura quase sempre. Como apontado por knightpfhor :
string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
Aqui está uma função que retira diacríticos de uma sequência:
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);
}
Mais detalhes no blog de MichKap ( RIP ... ).
O princípio é que ele transforma 'é' em 2 caracteres sucessivos 'e', agudos. Em seguida, itera pelos caracteres e ignora os sinais diacríticos.
"héllo" se torna "he <acute> llo", que por sua vez se torna "olá".
Debug.Assert("hello"==RemoveDiacritics("héllo"));
Nota: Aqui está uma versão mais compacta do .NET4 + da mesma função:
static string RemoveDiacritics(string text)
{
return string.Concat(
text.Normalize(NormalizationForm.FormD)
.Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch)!=
UnicodeCategory.NonSpacingMark)
).Normalize(NormalizationForm.FormC);
}
string.Normalize
?Se você não precisa converter a string e deseja apenas verificar a igualdade, pode usar
ou se você quiser que a comparação também não diferencie maiúsculas de minúsculas
fonte
O método a seguir
CompareIgnoreAccents(...)
funciona nos seus dados de exemplo. Aqui está o artigo em que obtive minhas informações básicas: http://www.codeproject.com/KB/cs/EncodingAccents.aspxEu acho que um método de extensão seria melhor:
Então o uso seria o seguinte:
fonte
Eu tive que fazer algo semelhante, mas com um método StartsWith. Aqui está uma solução simples derivada do @Serge - appTranslator.
Aqui está um método de extensão:
E para um forros malucos;)
Início sem distinção entre maiúsculas e minúsculas e maiúsculas e minúsculas
fonte
Uma maneira mais simples de remover acentos:
fonte
tente essa sobrecarga no método String.Compare.
Método String.Compare (String, String, Boolean, CultureInfo)
Ele produz um valor int com base nas operações de comparação, incluindo informações sobre a cultura. o exemplo na página compara "Alterar" em en-US e en-CZ. CH em en-CZ é uma única "letra".
exemplo do link
portanto, para idiomas acentuados, você precisará obter a cultura e testar as strings com base nisso.
http://msdn.microsoft.com/en-us/library/hyxc48dt.aspx
fonte