2012-02-19 3 views
5

Я разрабатываю эвристику для автоматического определения языка и хотел бы узнать, имеет ли данное письмо диакритические знаки (например, «Рэя» Êóëüòóðà »- все буквы имеют диакритические знаки). Было бы лучше, если бы я мог получить тип диакритики, если это возможно.Как проверить, имеет ли символ Unicode диакритические знаки в .Net?

Я просмотрел UnicodeCategory перечисление, но не нашел ничего, что могло бы помочь мне здесь.

+0

Письмо eth() не имеет диакритики. В Unicode это базовый символ; удар не рассматривается как диакритический. Вы можете, таким образом, пожелать переформулировать свою цель (и, возможно, объяснить, какую конкретную проблему она решит, поскольку могут быть более эффективные подходы). –

+2

Декомпозиция - это последнее, что вы хотите сделать. Комбинация конкретного письма с конкретной диакритикой является сильным выбором для языка. Просто создайте частотные таблицы спереди. Но есть много языков, которые используют рядом без диакритики. Например, вы не сможете отличить английский, голландский и итальянский. Вам понадобится словарь, чтобы он действительно работал. Хранение, скажем, 100 наиболее распространенных слов будет длиться долго. –

ответ

11

Один из возможных способов - нормализовать его до формы, в которой буквы и их диакритики написаны как несколько кодовых точек. Затем проверьте, есть ли у вас письмо с акцентами.

Адаптация от How do I remove diacritics (accents) from a string in .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); 
} 
+3

Если вам нужна проверка истина/ложь, вы можете просто нормализовать ее на FormD или что бы это ни было, и просто проверьте, длиннее ли строка, чем оригинал. –

+1

@JoakimJohansson Я бы не удивился, если бы были другие глифы, которые разлагаются в FormD, но не являются акцентированными буквами. Но я не знаю, насколько хорошо моя идея будет вести себя и над этими. – CodesInChaos

+2

@JoakimJohansson Один большой класс символов, который ваш алгоритм считает диакритикой, - это корейские символы ханула. Они состоят из нескольких частей, которые разлагаются, но не являются диакритическими. Некоторые примеры: '가', '간', '갂'. Тогда есть математические символы, такие как: '≠', '⊉',' ∄', '∦' И, наконец, некоторые из них, которые я вообще не знаю:' ஔ' – CodesInChaos

Смежные вопросы