我正试图用波兰语中的pangram删除变音字符。我正在使用Michael Kaplan的博客http://www.siao2.com/2007/05/14/2629747.aspx中的代码,但没有成功。
考虑一下pangram:“Pchnąćwtęłódźjeżaluxośmskrzyńfig。”。一切正常,但对于字母“ł”,我仍然得到“ł”。我想问题是“ł”表示为单个unicode字符,并且没有跟随NonSpacingMark。
你知道我怎么能解决它(不依赖于某些字典中的自定义映射 - 我正在寻找某种unicode转换)?
答案 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!")