2010-08-24 14 views
8

Ich versuche diakritische Zeichen aus einem Pangram in Polnisch zu entfernen. Ich verwende Code von Michael Kaplans Blog http://www.siao2.com/2007/05/14/2629747.aspx, allerdings ohne Erfolg.Entfernen von diakritischen Zeichen in Polnisch

Betrachten Sie folgenden Pangram: "Pchnąć w tę łódź jeża lub ośm skrzyń fig.". Alles funktioniert gut, aber für den Buchstaben "ł" bekomme ich immer noch "ł". Ich nehme an, das Problem ist, dass "ł" als einzelnes Unicode-Zeichen dargestellt wird und es keine folgende NonSpacingMark gibt.

Haben Sie eine Idee, wie ich es beheben kann (ohne auf benutzerdefinierte Zuordnung in einem Wörterbuch zu verlassen - ich bin auf der Suche nach einer Art von Unicode-Konvertierung)?

Antwort

3

Der Ansatz in diesem Artikel besteht darin, Zeichen mit Leerzeichen zu entfernen. Da, wie Sie richtig angeben, "ł" nicht aus zwei Zeichen besteht (eines davon ist Mark, Nonspacing), wird das Verhalten erwartet, das Sie sehen.

Ich glaube nicht, dass die Struktur von Unicode Ihnen ermöglicht, eine voll automatisierte Neuzuordnung zu erreichen (der Autor des Artikels, auf den Sie verweisen, kommt zur gleichen Schlussfolgerung).

Wenn Sie nur an polnischen Zeichen interessiert sind, ist zumindest die Zuordnung klein und gut definiert (siehe z. B. die Unterseite von http://www.biega.com/special-char.html). Für den allgemeinen Fall glaube ich nicht, dass eine automatische Lösung für Zeichen existiert, die nicht aus einem Standardzeichen plus einem Zeichen ohne Abstand bestehen.

2

Es ist in der Unicode chart, Codepunkt \ u0142. Scrollen Sie nach unten zur Beschreibung "Kleiner lateinischer Buchstabe mit Strich", es ist keine Dekomposition aufgeführt. Ich weiß nichts über Polnisch, aber es ist üblich, dass ein Buchstabe ein Unterscheidungsmerkmal hat, das ihn zu einem eigenen Buchstaben macht, anstelle eines Basisbuchstabens mit einem diakritischen Zeichen.

1

Es gibt einige vorkomposierte Zeichen, die keine sinnvollen Dekompositionen enthalten.

(Es gibt auch eine Handvoll, die vernünftige Zerlegungen haben könnte, die von einer solchen Zerlegung in den meisten Normalisierungsformen verboten sind, da es zu Unterschieden zwischen Version führen würde, die sie nicht wirklich Normalisierung mehr machen würde).

ist einer von diesen. IIRC es ist auch nicht möglich, Alphabeten, die kein ł verwenden, eine kulturneutrale Transkription zu geben. Ich denke, dass die Deutschen es eher auf w als auf l übertragen (oder vielleicht ist es jemand anderes), was einen Sinn ergibt (es ist auch nicht ganz richtig, aber es ist näher als ich).

2

Sie müssen diese manuell ersetzen (genau wie mit ÆÐØÞßæðøþ in Latin-1).

Andere Leute hatten das gleiche Problem, daher hat das Unicode Common Locale Data Repository "vereinbart, einen Transliterator hinzuzufügen, der die Entfernung von Akzenten auch für überlagerte Akzente ermöglicht." (Ticket #2884)

2

Hier ist meine schnelle Umsetzung der polnischen Sperrliste mit Normalisierung der polnischen Diakritika.

class StopList 
{ 
    private HashSet<String> set = new HashSet<String>(); 

    public void add(String word) 
    { 
     word = word.trim().toLowerCase(); 
     word = normalize(word); 
     set.add(word); 

    } 

    public boolean contains(final String string) 
    { 
     return set.contains(string) || set.contains(normalize(string)); 
    } 

    private char normalizeChar(final char c) 
    { 
     switch (c) 
     { 
      case 'ą': 
       return 'a'; 
      case 'ć': 
       return 'c'; 
      case 'ę': 
       return 'e'; 
      case 'ł': 
       return 'l'; 
      case 'ń': 
       return 'n'; 
      case 'ó': 
       return 'o'; 
      case 'ś': 
       return 's'; 
      case 'ż': 
      case 'ź': 
       return 'z'; 
     } 
     return c; 
    } 

    private String normalize(final String word) 
    { 
     if (word == null || "".equals(word)) 
     { 
      return word; 
     } 
     char[] charArray = word.toCharArray(); 
     char[] normalizedArray = new char[charArray.length]; 
     for (int i = 0; i < normalizedArray.length; i++) 
     { 
      normalizedArray[i] = normalizeChar(charArray[i]); 
     } 
     return new String(normalizedArray); 
    } 
} 

Ich konnte keine andere Lösung im Internet finden. Vielleicht wird es hilfreich sein für jemanden

+0

des Expect 'L' alle diese Zeichen haben nur [diakritische Zeichen] (http: //en.wikipedia.org/wiki/Diacritic) (ich sehe zumindest Ogonek, akut und dot) und könnte leicht mit 'Normalize' normalisiert werden. Ich würde vorschlagen, die beiden Methoden zu kombinieren. – BalusC

+0

Normalisieren ist .NET-Bibliothek? Sorry ... das ist Schnipsel von meinem Java-Code :) Und beim Schreiben von "Net" habe ich über Internet nachgedacht, nicht ".NET". –

2

Vor einiger Zeit habe ich auf diese Lösung kommen, die gut zu funktionieren scheint (?):

public static string RemoveDiacritics(this string s) 
    { 
     string asciiEquivalents = Encoding.ASCII.GetString(
        Encoding.GetEncoding("Cyrillic").GetBytes(s) 
       ); 

     return asciiEquivalents; 
    } 
+0

Das ist toll funktioniert wie ein Charme – lag

Verwandte Themen