如何检查 .Net 中的 Unicode 字符是否有变音符号?

发布于 2025-01-06 20:34:46 字数 171 浏览 0 评论 0原文

我正在开发一种用于自动语言检测的启发式方法,并且想找出给定的字母是否具有变音符号(例如“Ðàäèî Êóëüòóðà” - 所有字母都有变音符号)。如果可能的话,如果我也能得到变音符号的类型,那就最好了。

我浏览了 UnicodeCategory 枚举,但没有找到任何可以帮助我的东西。

I am developing a heuristic for automatic language detection and would like to find out whether the given letter has diacritics (like "Ðàäèî Êóëüòóðà" -- all letters have diacritics). It would be best if I could also get the type of diacritic, if possible.

I browsed through UnicodeCategory enum but didn't find anything that could help me here.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

你又不是我 2025-01-13 20:34:46

一种可能的方法是将其标准化为将字母及其变音符号写成多个代码点的形式。然后检查是否有字母后跟重音符号。

改编自 如何删除变音符号(重音符号)来自 .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);
}

One possible way is to normalize it to a form where letters and their diacritics are written as several codepoints. Then check if you have a letter followed by accents.

Adapting from How do I remove diacritics (accents) from a string in .NET?, you can normalize with Normalize(NormalizationForm.FormD) and check for the diacritics with 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);
}
尸血腥色 2025-01-13 20:34:46

试试这个:


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

Try this:


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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文