我正在开发自动语言检测的启发式算法,想知道给定的字母是否有变音符号(比如“Ðàäèî Êóëüòóðà”——所有字母都有变音符号)。如果可能的话,最好能够获取变音符号的类型。我翻阅了UnicodeCategory枚举,但没有找到任何可以帮助我的东西。
一种可能的方法是将其规范化为以字母及其音标写成多个代码点的形式。然后检查是否有一个字母后跟着音标。
参考如何在 .NET 中删除变音符号 (音调)?,您可以使用Normalize(NormalizationForm.FormD)
进行规范化,并使用UnicodeCategory.NonSpacingMark
检查变音符号。
bool IsLetterWithDiacritics(char c)
{
var s = c.ToString().Normalize(NormalizationForm.FormD);
return (s.Length > 1) &&
char.IsLetter(s[0]) &&
s.Skip(1).All(c2 => CharUnicodeInfo.GetUnicodeCategory(c2) == UnicodeCategory.NonSpacingMark);
}
가
、간
、갂
。然后还有数学符号,例如:≠
、⊉
、∄
、∦
。最后还有一些我完全不知道的字符:ஔ
。 - CodesInChaos"\u0CBF"
是 UnicodeCategory.NonSpacingMark
,但它不是一个变音符号。 - Paolo Moretti试试这个:
public bool CheckIsStringContainDiacriticsCharacter(string text)
{
bool IsDiacriticsCharacter = false;
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);
}
else
{
IsDiacriticsCharacter = true;
break;
}
}
return IsDiacriticsCharacter;
}