9

ポーランド語のパングラムから発音区別符号を削除しようとしています。Michael Kaplanのブログhttp://www.siao2.com/2007/05/14/2629747.aspxのコードを使用していますが、成功していません。

次のパングラムを検討してください:「Pchnąćwtęłódźjeżalubośmskrzyńfig。」すべて正常に動作しますが、文字「ł」の場合でも「ł」が表示されます。問題は、「ł」が単一のユニコード文字として表され、後続のNonSpacingMarkがないことだと思います。

どうすれば修正できるかわかりますか(辞書のカスタムマッピングに依存せずに、ある種のUnicode変換を探しています)。

4

7 に答える 7

8

しばらく前に私はこの解決策に出くわしました、それはうまくいくようです:

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

        return asciiEquivalents;
    }
于 2015-02-16T12:19:24.853 に答える
4

これは、ポーランド語の発音区別符号を正規化したポーランド語のストップリストの簡単な実装です。

    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);
    }
}

ネットで他の解決策を見つけることができませんでした。だから多分それは誰かのために役立つでしょう(?)

于 2010-09-28T16:19:23.947 に答える
3

この記事で採用されているアプローチは、マーク、非スペーシング文字を削除することです。正しく指摘しているように、「ł」は2つの文字(そのうちの1つはMark、Nonspacing)で構成されていないため、表示される動作は予想どおりです。

Unicodeの構造では、完全に自動化された再マッピングを実行できるとは思いません(参照する記事の作成者も同じ結論に達します)。

ポーランド語の文字だけに興味がある場合は、少なくともマッピングは小さく、明確に定義されています(たとえば、http://www.biega.com/special-char.htmlの下部を参照)。一般的なケースでは、標準文字とマーク、非間隔文字で構成されていない文字の自動化されたソリューションは存在しないと思います。

于 2010-08-24T21:22:45.653 に答える
2

これは、Unicodeチャートのコードポイント\u0142にあります。「ストローク付きラテン小文字」の説明まで下にスクロールすると、分解がリストされていません。ポーランド語については何も知りませんが、文字には発音区別符号付きの基本文字ではなく、独自の文字にする識別マークが付いているのが一般的です。

于 2010-08-24T21:44:44.597 に答える
2

これらは手動で置き換える必要があります(Latin-1のÆÐØÞßæðøþと同じように)。

他の人も同じ問題を抱えているため、Unicode Common Locale Data Repositoryは、「アクセントがオーバーレイされている場合でも、アクセントを削除するトランスリテーターを追加することに同意しました」。(チケット#2884

于 2010-08-25T12:42:55.453 に答える
1

意味のある分解がない合成済み文字がかなりあります。

(バージョン間の違いにつながり、実際には正規化されなくなるため、ほとんどの正規化形式でそのような分解が禁止されている合理的な分解を持つ可能性のあるものもいくつかあります)。

łはその1つです。IIRCは、łを使用しないアルファベットに文化に中立な文字起こしを与えることもできません。ドイツ人はそれをlではなくwに転写する傾向があると思います(またはおそらくそれは他の誰かがそうします)、それは理にかなっています(それはまったく正しい音ではありませんが、lよりも近いです)。

于 2010-08-25T00:15:17.160 に答える
-1

'ł'も処理しているソリューションを見つけました

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);
    }
于 2020-11-13T07:09:50.440 に答える