去除波兰语中的变音符号

时间:2010-08-24 20:45:02

标签: c# .net unicode diacritics polish

我正试图用波兰语中的pangram删除变音字符。我正在使用Michael Kaplan的博客http://www.siao2.com/2007/05/14/2629747.aspx中的代码,但没有成功。

考虑一下pangram:“Pchnąćwtęłódźjeżaluxośmskrzyńfig。”。一切正常,但对于字母“ł”,我仍然得到“ł”。我想问题是“ł”表示为单个unicode字符,并且没有跟随NonSpacingMark。

你知道我怎么能解决它(不依赖于某些字典中的自定义映射 - 我正在寻找某种unicode转换)?

7 个答案:

答案 0 :(得分:5)

前段时间我遇到过这个解决方案,看起来效果很好:

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

        return asciiEquivalents;
    }

答案 1 :(得分:3)

本文采用的方法是删除Mark,Nonspacing字符。因为正确地指出“ł”不是由两个字符组成(其中一个是Mark,Nonspacing),所以你看到的行为是预期的。

我不认为Unicode的结构允许您完成全自动重映射(您引用的文章的作者得出相同的结论)。

如果您只对波兰字符感兴趣,那么至少映射很小并且定义明确(参见例如http://www.biega.com/special-char.html的底部)。对于一般情况,我不认为对于不是由标准字符加上Mark,Nonspacing字符组成的字符,存在自动解决方案。

答案 2 :(得分:2)

它位于Unicode chart,代码点\ u0142。向下滚动到描述“带笔划的拉丁文小写字母”,它没有列出分解。对波兰语一无所知,但是一封信中有一个区别标记是很常见的,这个标记使它成为自己的字母而不是带有变音符号的字母。

答案 3 :(得分:2)

你必须手动更换这些(就像拉丁文-1中的ÆÐØÞßæðøþ一样)。

其他人遇到了同样的问题,因此Unicode公共区域设置数据存储库已经“同意添加一个可以删除重音符号的音译器,即使对于重叠的重音符号也是如此。” (Ticket #2884

答案 4 :(得分:2)

以下是我对波兰语停止列表的快速实施,并对波兰变音符号进行了规范化。

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

我在网上找不到任何其他解决方案。所以也许对某人有帮助(?)

答案 5 :(得分:1)

有相当多的预组合字符没有有意义的分解。

(还有一些可能有合理的分解,在大多数规范化形式中都禁止这种分解,因为它会导致版本之间的差异,这会使它们不再真正规范化。)

ł就是其中之一。 IIRC也不可能对不使用ł的字母表进行文化中性转录。我认为德国人倾向于将它转录为w而不是l(或者也许是其他人),这是有意义的(它也不是正确的声音,但它比l更接近)。

答案 6 :(得分:0)

我找到了也可以解决“ł”的解决方案

.setDescription("This is how to do it! ```js\n const fetch = require('node-fetch');\n const express = require('express');\n const app = express();\n let status = 404;\n app.get('/', (req, res) => {\n res.status(status).send('HEY!');\n console.log('Ping!');\n });\n const port = process.env.PORT || 4200;\n app.listen(port);\n console.log(port);\n setInterval(async () => {\n const response = await fetch('LIVE APP HERE');\n console.log(`Status - ${response.status}`);\n status = response.status;\n }, 30e4);```\n **Just add this particular code to your main file that are serverjs indexjs botjs etc and replace the text in line 13 with your live app!")