2010-10-28 9 views
5

habe ich eine Funktion erstellen, die diakritischen Zeichen in nicht-diakritischen Zeichen transformiert (basierend auf dieser post)Entfernen diakritischen Zeichen in Silverlight (String.Normalize Ausgabe)

Hier ist der Code:

Public Function RemoveDiacritics(ByVal searchInString As String) As String 
    Dim returnValue As String = "" 

    Dim formD As String = searchInString.Normalize(System.Text.NormalizationForm.FormD) 
    Dim unicodeCategory As System.Globalization.UnicodeCategory = Nothing 
    Dim stringBuilder As New System.Text.StringBuilder() 


    For formScan As Integer = 0 To formD.Length - 1 
     unicodeCategory = System.Globalization.CharUnicodeInfo.GetUnicodeCategory(formD(formScan)) 
     If unicodeCategory <> System.Globalization.UnicodeCategory.NonSpacingMark Then 
      stringBuilder.Append(formD(formScan)) 
     End If 
    Next 

    returnValue = stringBuilder.ToString().Normalize(System.Text.NormalizationForm.FormC) 

    Return returnValue 

End Function 

Leider Da die String.Normlize nicht Teil von Silverlight ist, muss ich eine andere Möglichkeit finden, diese Funktion zu schreiben.

Die einzige Lösung, die ich bisher gefunden habe, ist, einen Dienst auf der Serverseite zu erstellen, der die String.Normalize Funktion aufrufen und dann an die Clientseite zurückgeben würde ... aber das würde ein riesiges Leistungsproblem verursachen.

Es muss eine bessere Alternative geben, aber richtig, ich weiß nicht, wie ich dieses Problem beheben kann.

Antwort

1

Vielen Dank für Ihre Antwort Jim, aber ich habe versucht, die Normalisierung Klasse wie das Mono-Projekt zu implementieren, und irgendwann erkannte ich, es war ein Overkill, weil es viel zu viele Abhängigkeiten für etwas, das sollte einfach sein.

Ich kam mit dieser einfachen Implementierung ... es ist nicht perfekt, ich weiß (Dies wird nicht für jede Sprache funktionieren) aber es wird den Job für mich tun, bis MS eine Version von Silverlight mit Unterstützung für die Zeichenkettennormalisierung veröffentlicht.

<System.Runtime.CompilerServices.Extension()> _  
Public Function RemoveDiacritics(ByVal searchInString As String) As String 
    Dim returnValue As String = "" 

    returnValue = searchInString 

    returnValue = returnValue.ReplaceLowerAndUpperCase("À", "A") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Á", "A") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Â", "A") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Ã", "A") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Ä", "A") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Å", "A") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Æ", "A") 

    returnValue = returnValue.ReplaceLowerAndUpperCase("Ç", "C") 

    returnValue = returnValue.ReplaceLowerAndUpperCase("È", "E") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("É", "E") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Ê", "E") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Ë", "E") 

    returnValue = returnValue.ReplaceLowerAndUpperCase("Ì", "I") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Í", "I") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Î", "I") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Ï", "I") 

    returnValue = returnValue.ReplaceLowerAndUpperCase("Ñ", "N") 

    returnValue = returnValue.ReplaceLowerAndUpperCase("Ò", "O") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Ó", "O") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Ô", "O") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Õ", "O") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Ö", "O") 

    returnValue = returnValue.ReplaceLowerAndUpperCase("Ù", "U") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Ú", "U") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Û", "U") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Ü", "U") 

    returnValue = returnValue.ReplaceLowerAndUpperCase("Ý", "Y") 

    returnValue = returnValue.ReplaceLowerAndUpperCase("Æ", "AE") 
    returnValue = returnValue.ReplaceLowerAndUpperCase("Œ", "OE") 

    Return returnValue 

End Function 

<System.Runtime.CompilerServices.Extension()> _ 
Public Function ReplaceLowerAndUpperCase(ByVal searchInString As String, ByVal oldString As String, ByVal newString As String) As String 
    Dim returnValue As String = "" 

    returnValue = searchInString.Replace(oldString.ToLower, newString.ToLower) 
    returnValue = returnValue.Replace(oldString.ToUpper, newString.ToUpper) 

    Return returnValue 
End Function 
+0

Über die -1, wenn Sie eine andere funktionierende Lösung haben, sollten Sie es vielleicht hier veröffentlichen. –

1

Simon,

Hier ist eine einfache Implementierung von Normalisieren() Aufruf in eine Normalisierungs Klasse:

public string Normalize() 
{ 
    return Normalization.Normalize (this, 0); 
} 

public string Normalize (NormalizationForm normalizationForm) 
{ 
    switch (normalizationForm) 
    { 
     default: 
      return Normalization.Normalize (this, 0); 
     case NormalizationForm.FormD: 
      return Normalization.Normalize (this, 1); 
     case NormalizationForm.FormKC: 
      return Normalization.Normalize (this, 2); 
     case NormalizationForm.FormKD: 
      return Normalization.Normalize (this, 3); 
    } 
} 

Und Sie eine Implementierung der Normalisierungs Klasse aus dem Mono-Projekt auf GitHub durchsuchen:

http://github.com/mono/mono/blob/mono-2.6.4/mcs/class/corlib/Mono.Globalization.Unicode/Normalization.cs

Viel Glück,
Jim McCurdy

+0

Den Code von Mono zu verwenden ist eine gute Idee, aber leider ist es keine 100% verwaltete Implementierung; es verwendet eine Methode (load_normalization_resource), die in der Laufzeitumgebung ist ... –