Как удалить диакритические знаки (акценты) из строки в .NET?

Использование сопоставления может быть более эффективным, если вы хотите сделать это многократно или последовательно. Другим преимуществом является выбор метода интерполяции и способы обработки пограничных условий. Наконец, некоторые функции интерполяции также реализованы на графическом процессоре. переназначить

403
задан Colonel Panic 31 August 2014 в 14:28
поделиться

6 ответов

Я не использовал этот метод, но 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.

489
ответ дан Ry- 31 August 2014 в 14:28
поделиться

В случае, если любой заинтересовал, вот эквивалентный 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();
    }
}
16
ответ дан KenE 1 September 2014 в 01:28
поделиться

В случае, если кому-то интересно, я искал что-то подобное и закончил писать следующее:

    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
    }
29
ответ дан 22 November 2019 в 23:26
поделиться

Это отлично работает в 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("");
}
4
ответ дан 22 November 2019 в 23:26
поделиться

Это сделал для меня трюк ...

string accentedStr;
byte[] tempBytes;
tempBytes = System.Text.Encoding.GetEncoding("ISO-8859-8").GetBytes(accentedStr);
string asciiStr = System.Text.Encoding.UTF8.GetString(tempBytes);

Быстро и коротко!

149
ответ дан 22 November 2019 в 23:26
поделиться

ЭТО ВЕРСИЯ 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
2
ответ дан 22 November 2019 в 23:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: