Удаление диакритических знаков на польском языке - PullRequest
9 голосов
/ 25 августа 2010

Я пытаюсь удалить диакритические знаки из панграммы на польском языке.Однако я использую код из блога Майкла Каплана http://www.siao2.com/2007/05/14/2629747.aspx,, но безуспешно.

Рассмотрим следующую панораму: «Pchnąć w tę łódź jeża lub ośm skrzyń fig.».Все отлично работает, но на букву "ł" я все равно получаю "ł".Я предполагаю, что проблема в том, что «ł» представлен в виде единого символа Юникода, и нет никакого NonSpacingMark.

Есть ли у вас какие-либо идеи, как я могу это исправить (не полагаясь на пользовательское отображение в некотором словаре - яищу какой-то юникод конвертации)?

Ответы [ 6 ]

5 голосов
/ 16 февраля 2015

Некоторое время назад я столкнулся с этим решением, которое, кажется, работает нормально:

    public static string RemoveDiacritics(this string s)
    {
        string asciiEquivalents = Encoding.ASCII.GetString(
                     Encoding.GetEncoding("Cyrillic").GetBytes(s)
                 );

        return asciiEquivalents;
    }
3 голосов
/ 25 августа 2010

Подход, принятый в статье, заключается в удалении Марка, Нераспространяющихся символов.Поскольку, как вы правильно заметили, «ł» не состоит из двух символов (один из которых - «Марк», «Без пробелов»), ожидаемое вами поведение ожидается.

Я не думаю, что структура Unicode позволяет вамвыполнить полностью автоматизированное переназначение (автор статьи, на которую вы ссылаетесь, приходит к тому же выводу).

Если вас интересуют только польские символы, по крайней мере, отображение маленькое и четкое (см., например, нижнююиз http://www.biega.com/special-char.html). В общем случае, я не думаю, что существует автоматическое решение для символов, которые не состоят из стандартного символа плюс знак «Без пробела».

2 голосов
/ 28 сентября 2010

Вот мое быстрое внедрение польского стоп-листа с нормализацией польских диакритических знаков.

    class StopList
{
    private HashSet<String> set = new HashSet<String>();

    public void add(String word)
    {
        word = word.trim().toLowerCase();
        word = normalize(word);
        set.add(word);

    }

    public boolean contains(final String string)
    {
        return set.contains(string) || set.contains(normalize(string));
    }

    private char normalizeChar(final char c)
    {
        switch ( c)
        {
            case 'ą':
                return 'a';
            case 'ć':
                return 'c';
            case 'ę':
                return 'e';
            case 'ł':
                return 'l';
            case 'ń':
                return 'n';
            case 'ó':
                return 'o';
            case 'ś':
                return 's';
            case 'ż':
            case 'ź':
                return 'z';
        }
        return c;
    }

    private String normalize(final String word)
    {
        if (word == null || "".equals(word))
        {
            return word;
        }
        char[] charArray = word.toCharArray();
        char[] normalizedArray = new char[charArray.length];
        for (int i = 0; i < normalizedArray.length; i++)
        {
            normalizedArray[i] = normalizeChar(charArray[i]);
        }
        return new String(normalizedArray);
    }
}

Я не смог найти другого решения в сети.Так что, может быть, это будет кому-то полезно (?)

2 голосов
/ 25 августа 2010

Вам придется заменить их вручную (как и в случае с LatinÐØÞßæðøþ в Latin-1).

У других людей была такая же проблема, поэтому репозиторий общих языковых стандартов Unicode «согласился добавить транслитератор, который удаляет акцент, даже для накладных акцентов». ( Билет № 2884 )

2 голосов
/ 25 августа 2010

Это в Юникод-диаграмме , кодовая точка \ u0142. Прокрутите вниз до описания «Латинская строчная буква со штрихом», в нем нет разложения. Ничего не знаю о польском, но для письма характерно иметь отличительный знак, который делает его собственным, а не базовым с диакритическим знаком.

1 голос
/ 25 августа 2010

Существует довольно много предварительно составленных символов, которые не имеют значимых разложений.

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

ł является одним из них.IIRC также невозможно дать культурно-нейтральную транскрипцию алфавитам, которые не используют ł.Я думаю, что немцы склонны транскрибировать его вместо w (или, может быть, это кто-то другой), что имеет смысл (это не совсем правильный звук, но он ближе, чем l).

...