Удаление диакритических знаков в 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, а затем возвращала бы ее на стороне клиента... но это создало бы огромную проблему с производительностью.
Должна быть лучшая альтернатива, но точно знаю, что я понятия не имею, как решить эту проблему.
2 ответа
Спасибо за ваш ответ, Джим, но я попытался реализовать класс нормализации, как это сделал 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
Саймон,
Вот базовая реализация Normalize(), вызывающая класс Normalization:
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);
}
}
И вы можете просмотреть реализацию класса нормализации из проекта Mono на GitHub:
Удачи,
Джим МакКарди