Почему некоторые маркеры объединения Unicode (например, \ u0BCD) не совпадают [: alpha:] в Ruby? - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь использовать Ruby Regexp для кодов Тамил Юникод. И \u0BC0, и \u0BCD объединяют маркеры гласных в категории символов Mark, Nonspacing [Mn], что, на мой взгляд, должно соответствовать классу [:alpha:]. Но \u0BCD, похоже, не соответствует классу.

irb(main):002:0> "\u0BAE\u0BC0\u0BA9\u0BCD\u0BA9".scan(/[[:alpha:]]+/).each { |s| puts s.dump }
"\u0BAE\u0BC0\u0BA9"
"\u0BA9"
=> ["மீன", "ன"]
irb(main):003:0> 

Я на Ruby 2.6.5p114 на OS X 10.15.2. Что может происходить?

1 Ответ

2 голосов
/ 13 января 2020

Эти два символа (я выделил некоторые интересные вещи жирным шрифтом ):

В документации Ruby для Regexp класса явно не указано, что [[:alpha:]] соответствует , но он говорит, что выражения скобки POSIX соответствуют не-ASCII символам, и он дает [[:digit:]] в качестве примера, говоря, что он соответствует чему-либо со свойством Unicode Nd (десятичное число ) .

Пока не бывший явным образом задокументировано, имеет смысл приравнять Regexp скобочное выражение POSIX [[:alpha:]] к свойству Unicode Alphabeti c, что будет означать, что U + 0BC0 соответствует и U + 0BCD не.

С другой стороны, документация для Onigmo (движок Regexp, используемый в YARV и отраженный во всех других реализациях) делает явно указать работу [[:alpha:]]. Фактически, он указывает его в двух разных местах, и они противоречат друг другу:

Итак, что похоже происходит, так это то, что Консорциум Unicode не рассматривает U + 0BCD как alphabeti c, и, следовательно, Onigmo и Ruby не классифицируют его как [[:alpha:]]. В этом случае документация Onigmo неверна, а документация Ruby является неточной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...