Удалить диакритические знаки ((ǹ ň ñ ṅ ņ ṇ ṋ ṉ ̈ ɲ ƞ ᶇ ȵ ȵ) из символов Unicode - PullRequest
84 голосов
/ 21 сентября 2009

Я смотрю на алгоритм, который может отображать символы с диакритическими знаками ( тильда , окружность , каретка , умлаут , caron ) и их "простой" характер.

Например:

ń  ǹ  ň  ñ  ṅ  ņ  ṇ  ṋ  ṉ  ̈  ɲ  ƞ ᶇ ɳ ȵ  --> n
á --> a
ä --> a
ấ --> a
ṏ --> o

Etc.

  1. Я хочу сделать это на Java, хотя я подозреваю, что это должно быть что-то Unicode-y и должно быть легко выполнимо на любом языке.

  2. Цель: облегчить поиск слов с диакритическими знаками. Например, если у меня есть база данных теннисистов и введен Björn_Borg, я также сохраню Bjorn_Borg, чтобы найти его, если кто-то войдет в Bjorn, а не в Björn.

Ответы [ 12 ]

2 голосов
/ 21 сентября 2009

Юникод имеет определенные диатрические символы (которые являются составными символами), и строку можно преобразовать так, чтобы символ и диатрики были разделены. Затем вы можете просто удалить указатели из строки, и все готово.

Для получения дополнительной информации о нормализации, декомпозиции и эквивалентности см. Стандарт Unicode на домашней странице Unicode .

Однако то, как вы можете добиться этого, зависит от фреймворка / ОС / ... над которым вы работаете. Если вы используете .NET, вы можете использовать метод String.Normalize , принимающий перечисление System.Text.NormalizationForm .

1 голос
/ 26 сентября 2009

Для дальнейшего использования, вот метод расширения C #, который удаляет акценты.

public static class StringExtensions
{
    public static string RemoveDiacritics(this string str)
    {
        return new string(
            str.Normalize(NormalizationForm.FormD)
                .Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != 
                            UnicodeCategory.NonSpacingMark)
                .ToArray());
    }
}
static void Main()
{
    var input = "ŃŅŇ ÀÁÂÃÄÅ ŢŤţť Ĥĥ àáâãäå ńņň";
    var output = input.RemoveDiacritics();
    Debug.Assert(output == "NNN AAAAAA TTtt Hh aaaaaa nnn");
}
...