2010-10-28 33 views
5

我沒有創造轉變音調符號字符轉換成非讀音符號字符的功能(在此基礎上post在Silverlight(String.Normalize問題)刪除變音符號

下面的代碼:

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 

不幸的是,因爲String.Normlize不是Silverlight的一部分,所以我需要找到另一種寫這個函數的方法。

到目前爲止我發現的唯一解決方案是在服務器端創建一個服務器,它將調用String.Normalize函數,然後將其返回給客戶端...但這會造成巨大的性能問題。

必須有更好的選擇,但是知道我不知道如何解決這個問題。

回答

1

感謝您的回答吉姆,但我試圖像Mono Project那樣實現規範化類,並且在某一時刻,我意識到這是一個矯枉過正的事情,因爲涉及太多的依賴涉及應該很簡單的事情。

我想出了這個簡單的實現......這並不完美,我知道(這不適用於每種語言),但它會爲我完成這項工作,直到MS發佈帶有字符串規範化支持的Silverlight版本。

<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

關於-1,如果您有任何其他工作解決方案,也許應該在此處發佈它。 – 2011-07-14 17:35:25

1

西蒙,

下面是一個基本實現正常化(),稱成規範化類:

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

而且你可以瀏覽從GitHub上的Mono項目正常化類的實現:

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

祝你好運,
吉姆·麥柯迪

+0

使用Mono的代碼是一個好主意,但不幸的是它不是100%管理的實現;它使用運行時內部的方法(load_normalization_resource)... – 2012-08-15 02:34:40