Страницы

Поиск по вопросам

пятница, 14 февраля 2020 г.

Как получить набор символов заданной категории Unicode?

#c_sharp #linq


Для того, что бы получить заданный набор символов для указанной категории Юникода
я создал словарь charInfo :

// Get all Unicode groups:
Dictionary> charInfo = (
      Enumerable.Range(0, 0x110000)
          .Where  (x => (x < 0x00D800 || x > 0x00DFFF))
          .Select (Char.ConvertFromUtf32)
          .Where  (x => x.Length == 1   )
          .GroupBy(s => Char.GetUnicodeCategory(s, 0))
          .ToDictionary(g => g.Key)
);


Когда я извлекаю из словаря категорию UnicodeCategory.DashPunctuation:

var characters = CharInfo[UnicodeCategory.DashPunctuation]?.ToArray();


получается массив characters состоящий из 25 символов в то время как исходя из документации
Unicode в данной категории всего 24 символа. 

Я проверил принадлежность символов полученного массива к категории \p{Pd} (Unicode
Character Category 'Punctuation, Dash') при помощи тестов и регулярного выражения:

Regex.IsMatch(value, @"\p{P}", RegexOptions.Multiline);


В результате выявлен 1 символ из 25 не относящийся к категории Unicode 'Punctuation,
Dash'.

Объясните пожалуйста, почему я получаю 25 символов вместо 24. Где ошибка? Как ее
исправить?
    


Ответы

Ответ 1



Ошибка в том, что вы решили, что последний стандарт Юникода хостится на сайте, который никакого отношения к юникоду не имеет :) То, что вы считаете «документацией unicode» является документацией версии 5.0 от 2006 года, где в категории Unicode Dash Characters 24 символа (см. Table 6-3. Unicode Dash Characters). В более новых стандартах Unicode, начиная с версии 5.2 от 2009 года уже 25 символов (смотреть ту же таблицу). Соответственно, метод Char.GetUnicodeCategory основан на более позднем стандарте. (Для .NET 4.6.0 на основе стандарта 6.3, а для 4.6.1 аж 8.0) Исходя из той же документации, метод Char.GetUnicodeCategory может возвращать категорию для символа из предыдущего стандарта по соображениям совместимости. Поэтому, лучше использовать метод CharUnicodeInfo.GetUnicodeCategory который должен всегда возвращать категорию из текущего стандарта юникода для фреймворка.

Комментариев нет:

Отправить комментарий