2010-10-28 20 views
5

me hicieron crear una función que transforma caracteres diacríticos en caracteres no diacríticos (en base a este post)diacríticos Extracción en Silverlight (tema) String.Normalize

Aquí está el código:

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 

Por desgracia, como String.Normlize no es parte de Silverlight, necesito encontrar otra forma de escribir esta función.

La única solución que he encontrado hasta ahora es crear un servicio en el servidor que llamaría a la función String.Normalize y luego la devolvería al lado del cliente ... pero eso crearía un gran problema de rendimiento.

Debe haber una alternativa mejor, pero no tengo ni idea de cómo solucionar este problema.

Respuesta

1

Gracias por su respuesta Jim, pero traté de implementar la clase de normalización como el Mono Project y en un momento dado, me di cuenta de que era una exageración porque hay demasiadas dependencias involucradas para algo que debería ser simple.

Se me ocurrió esta sencilla implementación ... no es perfecta, lo sé (Esto no funcionará para todos los idiomas) pero hará el trabajo por mí hasta que MS lance una versión de Silverlight con soporte de normalización de cadenas.

<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

Acerca del -1, si tiene otra solución de trabajo, tal vez debería publicarla aquí. –

1

Simon,

Aquí es una implementación básica de Normalizar(), poniendo en una clase de Normalización:

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

Y se puede navegar por una implementación de la clase Normalización del proyecto Mono en GitHub:

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

Buena suerte,
Jim McCurdy

+0

Utilizando el código de Mono es una buena idea, pero por desgracia, no es una aplicación gestionada 100%; usa un método (load_normalization_resource) que es interno al tiempo de ejecución ... –