Как проверить, какой язык поддерживает какой уровень поддержки в регулярных выражениях Unicode? - PullRequest
6 голосов
/ 19 августа 2011

Различные уровни поддержки регулярных выражений Unicode описаны в UTS # 18 .

Есть ли способ провести несколько тестов для каждого требования, чтобы можно было портироватьтесты на соответствующем языке, их запуск и сбор результатов?

Есть ли в других документах Unicode понятие уровней поддержки, например, для реализаций / библиотек String?

Ответы [ 2 ]

7 голосов
/ 20 августа 2011

Для справки, и ICU4C, и Perl поддерживают UTS # 18 Level 1, а также несколько важных функций уровня 2.К ним относятся именованные символы с \N{...}, графемы с \X, полные свойства, такие как \p{East_Asian_Width=Full_Width}, и в случае ICU, а также более интересные границы по умолчанию для слов с помощью подправленного \b.Все три из этих функций регулярных выражений Уровня 2 значительно упрощают использование регулярных выражений в Юникоде, и без них вам придется в лучшем случае делать неприятные вещи, а в худшем - вообще не делать.

Perl и ICU4C несколько отличаютсятем не менее, в том, что Perl поддерживает полное основанное на строковых значениях регистр, в то время как ICU поддерживает только простое основанное на символах регистр.В Perl также есть довольно много не-Unicode-расширений для регулярных выражений, которые ICU не поддерживает, такие как обходные пути и именованные группы в ваших регулярных выражениях, которые действительно очень полезны.

Perl также допускает пользовательские / пользовательские свойстваи именованные символы, которые полезны для многих вещей, в том числе для кодовых точек области частного использования (PUA), поскольку теперь вы можете определять свои собственные имена и свойства для любых символов PUA, которые вы хотите использовать.(Например, для сценариев, запланированных для включения в Unicode, таких как сценарии в неофициальном реестре ConScript .)

Java не поддерживает даже UTS # 18 уровня 1 до совсем недавно выпущенного JDK7и то только минимально.С Java6 или более ранними версиями все мелочи не так или отсутствуют.В целом, поддержка Unicode в Java в JDK очень слабая: вы должны использовать классы UCharacter и т.д. ICU4J, , а не классы OraSun, для любой серьезной работы с Unicode, или вы сойдете с ума.Верно.

Но кроме этих немногих, ничто иное не подходит даже близко. Вы можете иногда хромать в Python или Ruby, если вы осторожны и вам не нужно делать слишком много: Например, Нет сортировки или поиска, практически нет свойств символов Unicode, даже не правильные границы слов и т. д.

Люди, пытающиеся сделать что-то вообще с Unicode в Javascript или PHP, должны просто выйти, прежде чем ониНачните.Это слишком больно, потому что вы не можете манипулировать Юникодом любым полезным или реалистичным способом без доступа к свойствам символов и, возможно, к графемам.

Существуют также межязыковые проблемы Юникода с отображением и смещением, нормализацией, переносом строк исопоставление, все из которых варьируются между языками.Вам нужен доступ к большинству, если не ко всем из них, для работы с Unicode.Отсутствие полной поддержки свойств представляет собой реальную проблему почти для всех языков, потому что свойства символов являются основой, от которой зависят многие алгоритмы.

Я говорю о большей части этого в моем обсуждении поддержки Unicode ..

Итог

Суть в том, что на момент написания этой статьи вы не можете ни использовать регулярные выражения ICU, ни сам Perl (но не PCRE), либо, возможно, также использовать Мэтью Барнетта regex библиотека в Python, тогда вы в основном запутались с регулярными выражениями Unicode.Никто другой в настоящее время не воспринимает регулярные выражения и / или Unicode достаточно серьезно, хотя Unicode 20 лет.

Это имеет серьезные последствия для «веббишевых» языков, таких как Javascript и PHP, потому что нет доступных альтернатив, и поэтому вы должны перенести любую реальную работу на другой серверный язык, потому что веб-языки могут «Не обращайтесь с Unicode любым разумным способом.Ничто не работает на стороне клиента, что является серьезным бременем.

Также обратите внимание, что для получения регулярных выражений ICU через Java требуется развернуть свой собственный JNI (или использовать те из Android), чтобы добраться до ICU4C:нет привязок ICU4J для регулярных выражений ICU.

3 голосов
/ 19 августа 2011

Я предполагаю, что где-то существуют тесты, которые проверяют уровни поддержки.
Например, в Perl есть довольно обширные документы по поддержке Unicode в регулярных выражениях
и поддержке Unicode в целом на языке.

Пример документации уровня поддержки регулярных выражений Perl:
http://perldoc.perl.org/perlunicode.html#Unicode-Regular-Expression-Support-Level

Юникод настолько сложен, что тестовые примеры будут исходить от авторов языков.

...