代码之家  ›  专栏  ›  技术社区  ›  The_Black_Smurf Goutham

删除Silverlight中的变音符号(String.Normalize问题)

  •  5
  • The_Black_Smurf Goutham  · 技术社区  · 14 年前

    我确实创建了一个函数,将变音字符转换为非变音字符(基于此 post

    代码如下:

    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的一部分,我需要另一种方法来编写这个函数。

    一定有更好的选择,但我不知道如何解决这个问题。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jim McCurdy    14 年前

    西蒙,

    下面是Normalize()的基本实现,它调用一个规范化类:

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

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

    祝你好运,
    吉姆·麦考迪

        2
  •  1
  •   The_Black_Smurf Goutham    13 年前

    我想出了这个简单的实现。。。它并不完美,我知道(这对每种语言都不起作用),但在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