15 Stimmen

So ändern Sie diakritische Zeichen in nicht diakritische Zeichen

Ich habe auf Stackoverflow eine Antwort gefunden, wie man diakritische Zeichen entfernt, aber könnten Sie mir bitte sagen, ob es möglich ist, diakritische Zeichen in nicht-diakritische zu ändern?

Oh.. und ich denke über .NET (oder andere, wenn nicht möglich)

0 Stimmen

Als ich das in Perl machen musste, hatte ich nur eine große, lange, handgepflegte "tr"-Anweisung, also viel Glück.

0 Stimmen

Dies ist ein Duplikat von mehrere fragen. suchen sie zum beispiel nach "translit". bitte verunstalten sie unsere sprachen nicht!

30voto

dan Punkte 9592

Da sich noch niemand die Mühe gemacht hat, den entsprechenden Code zu veröffentlichen, hier ist er:

    // \p{Mn} or \p{Non_Spacing_Mark}: 
    //   a character intended to be combined with another 
    //   character without taking up extra space 
    //   (e.g. accents, umlauts, etc.). 
    private readonly static Regex nonSpacingMarkRegex = 
        new Regex(@"\p{Mn}", RegexOptions.Compiled);

    public static string RemoveDiacritics(string text)
    {
        if (text == null)
            return string.Empty;

        var normalizedText = 
            text.Normalize(NormalizationForm.FormD);

        return nonSpacingMarkRegex.Replace(normalizedText, string.Empty);
    }

Hinweis: Ein wichtiger Grund für die Notwendigkeit, dies zu tun, ist, wenn Sie die Integration in ein System eines Drittanbieters, die nur ASCII, aber Ihre Daten sind in Unicode. Dies ist häufig der Fall. Sie haben grundsätzlich folgende Möglichkeiten: Entfernen Sie akzentuierte Zeichen, oder versuchen Sie, die Akzente aus den akzentuierten Zeichen zu entfernen, um so viel wie möglich von der ursprünglichen Eingabe zu erhalten. Natürlich ist dies keine perfekte Lösung, aber es ist zu 80 % besser als das einfache Entfernen von Zeichen oberhalb von ascii 127.

0 Stimmen

Ändert nicht "", den polnischen Buchstaben (ändert aber alle anderen seltsamen Buchstaben wie ó).

11voto

CesarB Punkte 41671

Kopieren von meine eigene Antwort auf eine andere Frage :

Anstatt eine eigene Tabelle zu erstellen, können Sie den Text auch in die Normalisierungsform D umwandeln, bei der die Zeichen als Basiszeichen plus diakritische Zeichen dargestellt werden (z. B. wird "á" durch "a" ersetzt, gefolgt von einem kombinierten akuten Akzent). Sie können dann alles entfernen, was kein ASCII-Buchstabe ist.

Die Tabellen gibt es immer noch, aber es sind jetzt die Tabellen aus dem Unicode-Standard.

Sie könnten auch NFKD anstelle von NFD versuchen, um noch mehr Fälle zu erfassen.

Referenzen:

9 Stimmen

Bitte tun sie das nicht, wenn es möglich ist. sie verstümmeln unsere sprachen. versuchen sie, die transliteration zu verwenden

0 Stimmen

@hop, es gibt viele triftige Gründe, dies zu tun (z. B. Erzeugung normalisierter n-Gramme für die lexikalische Analyse)

0 Stimmen

@Diadistis: a) ich glaube nicht, dass eine korrekte Transliteration diese Art von Analyse behindert und b) "viele triftige Gründe"? nennen Sie ein paar

4voto

erickson Punkte 256579

Es könnte sich auch lohnen, einen Schritt zurückzutreten und zu überlegen warum Sie wollen das tun. Wenn Sie versuchen, Zeichenunterschiede zu entfernen, die Sie für unbedeutend halten, sollten Sie sich den Unicode-Sortieralgorithmus ansehen. Dies ist die Standardmethode, um Unterschiede wie Groß- und Kleinschreibung oder diakritische Zeichen beim Vergleich von Zeichenketten für die Suche oder Sortierung außer Acht zu lassen.

Wenn Sie den geänderten Text anzeigen wollen, denken Sie an Ihr Publikum. Was Sie sicher wegfiltern können, ist ortsabhängig. Im US-Englischen ist "Igloo" = "Iglu" und "resume" = "résumé", aber im Türkischen wird das I klein geschrieben (ohne Punkt), und im Französischen bedeutet cote Zitat, côté Seite und côte Küste. Die Sprache der Zusammenstellung bestimmt also, welche Unterschiede von Bedeutung sind.

Wenn das Entfernen von diakritischen Zeichen die richtige Lösung für Ihre Anwendung ist, ist es am sichersten, eine eigene Tabelle zu erstellen, der Sie die zu konvertierenden Zeichen explizit hinzufügen.

Ein allgemeiner, automatisierter Ansatz könnte mit Hilfe der Unicode-Dekomposition entwickelt werden. Damit können Sie ein Zeichen mit diakritischen Zeichen in "kombinierende" Zeichen (die diakritischen Zeichen) und das Basiszeichen, mit dem sie kombiniert sind, zerlegen. Filtern Sie alles heraus, was ein kombinierendes Zeichen ist, und Sie sollten die "nicht-diakritischen" Zeichen erhalten.

Die fehlende Unterscheidung bei der automatisierten Methode könnte jedoch unerwartete Auswirkungen haben. Ich würde empfehlen, viele Tests mit einem repräsentativen Textkörper durchzuführen.

2 Stimmen

Ich denke, dass dies unter anderem dazu dient, schöne URLs zu erstellen

0 Stimmen

Ganz genau. Wenn Sie ein Produkt mit dem Namen "Rändi Fay_Female Vocalist" haben und einen URL-Stub /product/something generieren müssen, haben Sie im Wesentlichen die Wahl, das akzentuierte a durch ein unakzentuiertes zu ersetzen oder die Zeichenkette URL-escape zu machen, wobei ein hässliches Prozent zurückbleibt. Das unbetonte a ist bei weitem vorzuziehen. URLs sind maschinenlesbare Zeichenketten, aber es ist oft wichtig, dass sie zumindest halbwegs menschenlesbar sind.

3voto

Chris James Punkte 11229

Ein einfaches Beispiel:

Um diakritische Zeichen aus einer Zeichenkette zu entfernen:

string newString = myDiacriticsString.Normalize(NormalizationForm.FormD);

4 Stimmen

Funktioniert nicht: "e".Normalize(NormalizationForm.FormD) gibt nicht "e" zurück

0 Stimmen

Ja, verwenden Sie String.ToCharArray(), um es zu sehen.

0 Stimmen

Genau wie Feryt funktioniert es bei mir nicht. ("xxé").Normalize(NormalizationForm.FormD) liefert "xxe" (wie erwartet), aber string v = "xxé"; v.Normalize(NormalizationForm.FormD); liefert "xxé". Ich habe versucht, v.ToCharArray() und ("xxé").ToCharArray() aufzurufen, um zu sehen, ob es einen Unterschied gibt, sie geben das gleiche Array zurück. Sehr seltsam!

0voto

happytrails Punkte 1

Meine Website gibt Daten aus externen Quellen ein, die viele seltsame Zeichen enthalten. Ich habe die folgende C#-Funktion geschrieben, um akzentuierte Zeichen zu ersetzen und nicht-US-Tastaturzeichen mithilfe von Regex zu entfernen:

    using System.Text;
    using System.Text.RegularExpressions;

    internal static string SanitizeString(string source)
    {
        return Regex.Replace(source.Normalize(NormalizationForm.FormD), @"[^A-Za-z 0-9 \.,\?'""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*", string.Empty).Trim();    
    }

Ich hoffe, es hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X