Ähnlich aussehende Zeichen ersetzen

CPoly

Mitglied Weizenbier
Hi,

Der Titel ist vielleicht irreführend. Es geht darum, dass ich Zeichen wie z.b. é,è,ê durch e ersetzen will. Das soll dazu dienen bessere Suchtreffer zu erhalten, weil ich praktisch hinter den Kulissen nur auf einem Begrenzten Zeichensatz arbeiten. Mein bisheriger Code sieht folgendermaßen aus.

C#:
public static string ReplaceLookALikes(string text)
{
    if (String.IsNullOrEmpty(text))
        return text;

    char[][] cMap = new char[][] {
        new char[] {'A', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', '?', '?', '?'},
        new char[] {'a', 'à', 'á', 'â', 'ã', 'ä', 'å', '?', '?', '?'},
        new char[] {'O', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø'},
        new char[] {'o', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø'},
        new char[] {'E', 'È', 'É', 'Ê', 'Ë'},
        new char[] {'e', 'è', 'é', 'ê', 'ë'},
        new char[] {'I', 'Ì', 'Í', 'Î', 'Ï'},
        new char[] {'i', 'ì', 'í', 'î', 'ï'},
        new char[] {'U', 'Ù', 'Ú', 'Û', 'Ü'},
        new char[] {'u', 'ù', 'ú', 'û', 'ü'},
        new char[] {'Y', 'Ý', 'Ÿ', '¥'},
        new char[] {'C', 'Ç', '?'},
        new char[] {'c', 'ç', '?'},
        new char[] {'y', 'ý', 'ÿ'},
        new char[] {'D', 'Ð'},
        new char[] {'d', 'ð'},
        new char[] {'N', 'Ñ'},
        new char[] {'n', 'ñ'},
        new char[] {'S', 'Š'},
        new char[] {'s', 'š'},
        new char[] {'x', '×'},
        new char[] {'Z', 'Ž'},
        new char[] {'z', 'ž'}
   };

    string[][] sMap = new string[][] {
        new string[] {"AE", "Æ"},
        new string[] {"ae", "æ"},
        new string[] {"ss", "ß"},
        new string[] {"Th", "þ"},
        new string[] {"th", "Þ"},
        new string[] {"OE", "Œ"},
        new string[] {"oe", "œ"}
    };


    foreach (char[] cArr in cMap)
        for (int i = 1; i < cArr.Length; i++)
            text = text.Replace(cArr[i], cArr[0]);

    foreach (string[] sArr in sMap)
        for (int i = 1; i < sArr.Length; i++)
            text = text.Replace(sArr[i], sArr[0]);

    return text;
}

Mal davon abgesehen, dass die Liste der Buchstaben nicht unbedingt vollständig ist, Frage ich mich, ob man das ganze auch performanter machen könnte. Oder gibt es eine solche Funktion vielleicht bereits?

Das ganze steht nicht im .Net Forum, weil ich die Ersetzung in allen beteiligten System durchführen muss (Java, JavaScript, PHP und eventuell noch weitere).
 

CPoly

Mitglied Weizenbier
Da ich jetzt in ähnlichem Zusammenhang nochmal danach gesucht habe, wurde ich gerade fündig (Zumindest für .NET ;))!

Der Trick ist ganz einfach. In UTF8 ist es möglich Zeichen wie "é" entweder als ein Zeichen (ein Byte) oder durch zwei Zeichen (e + ´) darzustellen. Näheres z.B. hier http://dev.twitter.com/pages/counting_characters

.NET hat für den Fall natürlich vorgesorgt. Man kann das zweite Format "erzwingen" und anschließend über alle Zeichen iterieren und solche entfernen, die nur ein Diakritisches Zeichen (http://de.wikipedia.org/wiki/Diakritisches_Zeichen) darstellen.

Code: http://stackoverflow.com/questions/249087/how-do-i-remove-diacritics-accents-from-a-string-in-net

Edit: Und für Lucene(.Net) ist es mit einer Zeile getan. Einfach meinen eigenen Analyzer etwas erweitern.

http://lucene.apache.org/java/2_2_0/api/org/apache/lucene/analysis/ISOLatin1AccentFilter.html

C#:
result = new ISOLatin1AccentFilter(result);
 
Zuletzt bearbeitet: