Domanda

Sto usando questo metodo per rimuovere gli accenti dalle mie corde:

static string RemoveAccents(string input)
{
    string normalized = input.Normalize(NormalizationForm.FormKD);
    StringBuilder builder = new StringBuilder();
    foreach (char c in normalized)
    {
        if (char.GetUnicodeCategory(c) !=
        UnicodeCategory.NonSpacingMark)
        {
            builder.Append(c);
        }
    }
    return builder.ToString();
}

ma questo metodo foglie DJ come DJ e non cambia a d, anche se d è il suo carattere di base. si può provare con questa stringa di input "æøåáâăäĺćçčéęëěíîďđńňóôőöřůúűüýţ"

Cosa c'è di così speciale nella lettera DJ?

È stato utile?

Soluzione

La risposta per perché che non funziona è che l'affermazione che "d è il suo carattere di base" è falsa. U + 0111 (alfabeto latino D con corsa) presenta categoria Unicode "Lettera minuscola" e non ha mappatura decomposizione (cioè, non si decompone a "d" seguito da un punto combinando).

"đ".Normalize(NormalizationForm.FormD) restituisce semplicemente "đ", che non è spogliato fuori dal ciclo perché non è un marchio senza spaziatura.

Un problema simile esisterà per "O" e altre lettere per i quali Unicode fornisce alcuna mappatura decomposizione. (E se si sta cercando di trovare il "migliore" di caratteri ASCII per rappresentare una lettera Unicode, questo approccio non funziona affatto per cirillico, greco, cinese o di altri alfabeti non latini, avrete anche incorrere in problemi se si voleva di traslitterare "ß" in "ss", per esempio. Usando una libreria come UnidecodeSharp può aiutare.)

Altri suggerimenti

Devo ammettere che io non sono sicuro perché questo funziona, ma sembra sicuro di

var str = "æøåáâăäĺćçčéęëěíîďđńňóôőöřůúűüýţ";
var noApostrophes = Encoding.ASCII.GetString(Encoding.GetEncoding("Cyrillic").GetBytes(str)); 

=> "aoaaaaalccceeeeiiddnnooooruuuuyt"

" D con corsa " (Wikipedia) è utilizzato in diverse lingue, e sembra essere considerata una lettera distinta in tutti loro -. ed è per questo che rimane invariato

questo dovrebbe funzionare

    private static String RemoveDiacritics(string text)
    {
        String normalized = text.Normalize(NormalizationForm.FormD);
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < normalized.Length; i++)
        {
            Char c = normalized[i];
            if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
                sb.Append(c);
        }

        return sb.ToString();
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top