Использование сопоставления может быть более эффективным, если вы хотите сделать это многократно или последовательно. Другим преимуществом является выбор метода интерполяции и способы обработки пограничных условий. Наконец, некоторые функции интерполяции также реализованы на графическом процессоре. переназначить
Я не использовал этот метод, но Michael Kaplan описывает метод для того, чтобы сделать так в его сообщении в блоге (с запутывающим заголовком), который говорит о разделении диакритических знаков: Разделение является интересным заданием (иначе На значении бессмысленных, иначе символы All Mn без интервалов, но некоторые более без интервалов, чем другие)
static string RemoveDiacritics(string text)
{
var normalizedString = text.Normalize(NormalizationForm.FormD);
var stringBuilder = new StringBuilder();
foreach (var c in normalizedString)
{
var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
if (unicodeCategory != UnicodeCategory.NonSpacingMark)
{
stringBuilder.Append(c);
}
}
return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
}
Примечание, что это - продолжение его более раннего сообщения: диакритические знаки Разделения....
использование подхода Строка. Нормализуйте , чтобы разделить входную строку на составляющие глифы (в основном разделение "основных" символов от диакритических знаков) и затем просканировать результат и сохранить только основные символы. Это просто немного сложно, но действительно Вы смотрите на сложную проблему.
, Конечно, при ограничении себя французским языком Вам мог бы, вероятно, сойти с рук простой основанный на таблице подход в , Как удалить диакритические знаки и тильду в станд. C++:: строка , как рекомендуется @David Dibben.
В случае, если любой заинтересовал, вот эквивалентный Java:
import java.text.Normalizer;
public class MyClass
{
public static String removeDiacritics(String input)
{
String nrml = Normalizer.normalize(input, Normalizer.Form.NFD);
StringBuilder stripped = new StringBuilder();
for (int i=0;i<nrml.length();++i)
{
if (Character.getType(nrml.charAt(i)) != Character.NON_SPACING_MARK)
{
stripped.append(nrml.charAt(i));
}
}
return stripped.toString();
}
}
В случае, если кому-то интересно, я искал что-то подобное и закончил писать следующее:
public static string NormalizeStringForUrl(string name)
{
String normalizedString = name.Normalize(NormalizationForm.FormD);
StringBuilder stringBuilder = new StringBuilder();
foreach (char c in normalizedString)
{
switch (CharUnicodeInfo.GetUnicodeCategory(c))
{
case UnicodeCategory.LowercaseLetter:
case UnicodeCategory.UppercaseLetter:
case UnicodeCategory.DecimalDigitNumber:
stringBuilder.Append(c);
break;
case UnicodeCategory.SpaceSeparator:
case UnicodeCategory.ConnectorPunctuation:
case UnicodeCategory.DashPunctuation:
stringBuilder.Append('_');
break;
}
}
string result = stringBuilder.ToString();
return String.Join("_", result.Split(new char[] { '_' }
, StringSplitOptions.RemoveEmptyEntries)); // remove duplicate underscores
}
Это отлично работает в java.
Он в основном преобразует все акцентированные символы в их деакцентированные аналоги с последующим их объединением диакритических знаков. Теперь вы можете использовать регулярное выражение для удаления диакритических знаков.
import java.text.Normalizer;
import java.util.regex.Pattern;
public String deAccent(String str) {
String nfdNormalizedString = Normalizer.normalize(str, Normalizer.Form.NFD);
Pattern pattern = Pattern.compile("\\p{InCombiningDiacriticalMarks}+");
return pattern.matcher(nfdNormalizedString).replaceAll("");
}
Это сделал для меня трюк ...
string accentedStr;
byte[] tempBytes;
tempBytes = System.Text.Encoding.GetEncoding("ISO-8859-8").GetBytes(accentedStr);
string asciiStr = System.Text.Encoding.UTF8.GetString(tempBytes);
Быстро и коротко!
ЭТО ВЕРСИЯ VB (работает с GREEK):
Импортирует System.Text
Импортирует System.Globalization
Public Function RemoveDiacritics(ByVal s As String)
Dim normalizedString As String
Dim stringBuilder As New StringBuilder
normalizedString = s.Normalize(NormalizationForm.FormD)
Dim i As Integer
Dim c As Char
For i = 0 To normalizedString.Length - 1
c = normalizedString(i)
If CharUnicodeInfo.GetUnicodeCategory(c) <> UnicodeCategory.NonSpacingMark Then
stringBuilder.Append(c)
End If
Next
Return stringBuilder.ToString()
End Function