Frage

    

Diese Frage bereits eine Antwort hier:

         

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

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

War es hilfreich?

Lösung

Das Kopieren von Frage :

  

Statt Ihre eigene Tabelle zu erstellen, können Sie stattdessen den Text Normalisierungsform D konvertieren, wobei die Zeichen als Basiszeichen dargestellt werden und die diakritischen Zeichen (zum Beispiel „a“ wird durch „a“, gefolgt von einem ersetzt werden Kombinieren akut). Sie können dann alles abzustreifen, die kein ASCII Buchstaben ist.

     

Die Tabellen existieren noch, aber nun diejenigen sind, aus dem Unicode-Standard.

     

Sie können auch versuchen NFKD statt NFD, noch mehr Fälle zu fangen.

     

Referenzen:

     

Andere Tipps

Da niemand jemals die Mühe gemacht hat, den Code zu schreiben, dies zu tun, hier ist es:

    // \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 großer Grund für die Notwendigkeit, dies zu tun ist, wenn Sie zu einem 3rd-Party-System integrieren, die nur ascii tut, aber Ihre Daten sind in Unicode. Dies ist üblich. Ihre Optionen sind im Grunde: akzentuierte Zeichen entfernen oder versuchen, Akzente aus den akzentuierte Zeichen zu entfernen, um zu versuchen, so viel zu erhalten, wie Sie können von dem ursprünglichen Eingang. Offensichtlich ist dies keine perfekte Lösung, aber es ist 80% besser als einfach ein beliebiges Zeichen über ascii 127 zu entfernen.

Es könnte auch sinnvoll sein, einen Schritt zurück und betrachten Warum Sie wollen, dies zu tun. Wenn Sie Zeichen Unterschiede zu entfernen versuchen Sie unbedeutend betrachten, sollten Sie bei der Kollatierungsalgorithmus Unicode aussehen. Dies ist der normale Weg Unterschiede wie Fall oder diakritischen Zeichen zu ignorieren, wenn Strings zum Suchen oder Sortieren verglichen wird.

Wenn Sie den geänderten Text anzuzeigen planen, sollten Sie Ihr Publikum. Was Sie sicher filtern weg kann, ist locale empfindlich. In der US-Englisch: "Igloo" = "Iglu" und "Lebenslauf" = "Resume", aber in Türkisch, eine Kleinschreibung I I (ohne Punkt) und in Französisch, cote bedeutet Zitat, côté bedeutet Seite und côte Mittel Küste. So bestimmt die Sortierungssprache, was Unterschiede signifikant sind.

Wenn diakritische Zeichen zu entfernen die richtige Lösung für Ihre Anwendung ist, ist es am sichersten Ihre eigene Tabelle zu erzeugen, zu denen Sie explizit die Zeichen hinzufügen, die Sie konvertieren möchten.

Ein allgemeiner könnte automatisierter Ansatz unter Verwendung von Unicode Zersetzung entwickelt. Mit diesem können Sie ein Zeichen mit diakritischen Zeichen zersetzen zu „kombinieren“ Zeichen (die diakritischen Zeichen) und die Basiszeichen, mit denen sie kombiniert werden. Herauszufiltern, jede Sache, die eine Kombination von Zeichen ist, und Sie sollten die „nicht-diakritischen“ diejenigen haben.

Das Fehlen von Diskriminierung im automatisierten Verfahren könnte jedoch einige unerwartete Effekte. Ich würde eine Menge Tests an einem repräsentativen Textkörper empfehlen.

Für ein einfaches Beispiel:

So entfernen Sie diakritische Zeichen aus einem String:

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

Meine Website gibt Daten aus anderen Quellen, die viele seltsame Zeichen haben. Ich schrieb den folgenden C # Funktion akzentuierte Zeichen zu ersetzen und Nicht-US-Tastaturzeichen mit Regex Streifen aus:

    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();    
    }

Hoffe, es hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top