EDITAR 2012-01-20: ¡Oh chico! La solución fue mucho más simple y ha estado en el marco casi para siempre. Como señaló knightpfhor :
string.Compare(s1, s2, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
Aquí hay una función que elimina los signos diacríticos de una cadena:
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);
}
Más detalles en el blog de MichKap ( RIP ... ).
El principio es que convierte 'é' en 2 caracteres sucesivos 'e', agudo. Luego itera a través de los caracteres y omite los signos diacríticos.
"héllo" se convierte en "he <acute> llo", que a su vez se convierte en "hola".
Debug.Assert("hello"==RemoveDiacritics("héllo"));
Nota: Aquí hay una versión más compacta .NET4 + amigable de la misma función:
static string RemoveDiacritics(string text)
{
return string.Concat(
text.Normalize(NormalizationForm.FormD)
.Where(ch => CharUnicodeInfo.GetUnicodeCategory(ch)!=
UnicodeCategory.NonSpacingMark)
).Normalize(NormalizationForm.FormC);
}
string.Normalize
?Si no necesita convertir la cadena y solo desea verificar la igualdad, puede usar
o si quieres que la comparación no distinga entre mayúsculas y minúsculas
fuente
El siguiente método
CompareIgnoreAccents(...)
funciona en sus datos de ejemplo. Aquí está el artículo donde obtuve mi información de fondo: http://www.codeproject.com/KB/cs/EncodingAccents.aspxCreo que un método de extensión sería mejor:
Entonces el uso sería este:
fuente
Tuve que hacer algo similar pero con un método StartsWith. Aquí hay una solución simple derivada de @Serge - appTranslator.
Aquí hay un método de extensión:
Y por un lado lindos;)
Incensivo de acento y comienzo de incienso sensible a mayúsculas y minúsculas Se puede llamar así
fuente
Una forma más simple de eliminar acentos:
fuente
intente esta sobrecarga en el método String.Compare.
Método String.Compare (String, String, Boolean, CultureInfo)
Produce un valor int basado en las operaciones de comparación, incluida cultureinfo. el ejemplo en la página compara "Cambiar" en en-US y en-CZ. CH en en-CZ es una sola "letra".
ejemplo del enlace
por lo tanto, para los idiomas acentuados, necesitará obtener la cultura y luego probar las cadenas según eso.
http://msdn.microsoft.com/en-us/library/hyxc48dt.aspx
fuente