2010-10-28 23 views
5

BenÇıkarma diacritics

İşte kod (bu post dayanarak) olmayan diakritik karakterler içine aksan karakterleri dönüştüren bir işlev yarattı String.Normlize, Silverlight'ın bir parçası olmadığından, bu işlevi yazmanın başka bir yolunu bulmam gerekir.

Şimdiye kadar bulduğum tek çözüm, sunucu tarafında String.Normalize işlevini çağıran ve ardından istemci tarafına döndüren bir hizmet oluşturmaktır… ama bu büyük bir performans sorunu yaratacaktır.

Daha iyi bir alternatif olmalı, ancak bu sorunun nasıl çözüleceğine dair hiçbir fikrim yok.

cevap

1

Cevabınız için teşekkürler Jim ancak Mono Project'in yaptığı gibi normalleşme sınıfını uygulamaya çalıştım ve bir noktada, bunun bir overkill olduğunu fark ettim çünkü basit olması gereken bir şey için çok fazla bağımlılık var.

Bu basit uygulama ile ortaya çıktım ... mükemmel değil, biliyorum (Bu her dil için işe yaramaz) ancak MS, String normalizasyon desteğiyle bir Silver sürümü yayınlayana kadar benim için işi yapacak.

<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

Başka bir çalışma çözümünüz varsa -1 hakkında, belki de buraya göndermelisiniz. –

1

Simon, İşte

bir Normalleştirme sınıfa çağırarak Normale() temel uygulamasıdır: Eğer GitHub'dan Mono projesinden Normalleştirme sınıfının bir uygulama göz atabilir

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

Ve:

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

İyi şanslar,
Jim McCurdy

+0

Mono'nun kodunu kullanmak iyi bir fikirdir, ancak maalesef% 100 yönetilen bir uygulama değildir; Çalışma zamanına dahil olan bir yöntem (load_normalization_resource) kullanır ... –