¿Cómo elimino los signos diacríticos (acentos) de una cadena en .NET?

Resuelto James Hall asked hace 15 años • 22 respuestas

Estoy intentando convertir algunas cadenas que están en francés canadiense y, básicamente, me gustaría poder eliminar los acentos franceses en las letras manteniendo la letra. (Por ejemplo, convertir éa e, así crème brûléese convertiría en creme brulee)

¿Cuál es el mejor método para lograr esto?

James Hall avatar Oct 30 '08 09:10 James Hall
Aceptado

No he usado este método, pero Michael Kaplan describe un método para hacerlo en la publicación de su blog (con un título confuso) que habla sobre eliminar los signos diacríticos: Stripping es un trabajo interesante (también conocido como Sobre el significado de lo sin sentido, también conocido como Todos los caracteres Mn no están espaciados, pero algunos lo están más que otros)

static string RemoveDiacritics(string text) 
{
    var normalizedString = text.Normalize(NormalizationForm.FormD);
    var stringBuilder = new StringBuilder(capacity: normalizedString.Length);

    for (int i = 0; i < normalizedString.Length; i++)
    {
        char c = normalizedString[i];
        var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
        if (unicodeCategory != UnicodeCategory.NonSpacingMark)
        {
            stringBuilder.Append(c);
        }
    }

    return stringBuilder
        .ToString()
        .Normalize(NormalizationForm.FormC);
}

Tenga en cuenta que esta es una continuación de su publicación anterior: Eliminación de signos diacríticos....

El enfoque utiliza String.Normalize para dividir la cadena de entrada en glifos constituyentes (básicamente separando los caracteres "base" de los signos diacríticos) y luego escanea el resultado y retiene solo los caracteres base. Es un poco complicado, pero en realidad estás ante un problema complicado.

Por supuesto, si se limita al francés, probablemente pueda salirse con la suya con el enfoque simple basado en tablas en Cómo eliminar acentos y tildes en C++ std::string , como lo recomienda @David Dibben.

Blair Conrad avatar Oct 30 '2008 02:10 Blair Conrad

esto me sirvió...

string accentedStr;
byte[] tempBytes;
tempBytes = System.Text.Encoding.GetEncoding("ISO-8859-8").GetBytes(accentedStr);
string asciiStr = System.Text.Encoding.UTF8.GetString(tempBytes);

rápido y corto!

azrafe7 avatar Jan 18 '2010 14:01 azrafe7