Соответствует символу тайского сценария в Java

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

Я хочу просто игнорировать любые строки с символами тайского сценария, но я понятия не имею, как:

Pattern.compile("\\p{Thai}") не работает при инициализации. "[ก-๛]" - это когда-нибудь сработает? Какой правильный путь?


person alamar    schedule 18.03.2011    source источник
comment
У меня много сексуального времени с ... Вы уверены, что сексуальный было тем словом, которое вы там искали?   -  person T.J. Crowder    schedule 18.03.2011
comment
Не понимаю, как это применимо, но ничего страшного ... :-)   -  person T.J. Crowder    schedule 21.03.2011


Ответы (2)


Thai - это блок Unicode, а блоки Unicode должны быть указаны как \p{In...}:

Pattern.compile("\\p{InThai}") 
person axtavt    schedule 18.03.2011
comment
+1 Просто попробовал скомпилировать / запустить тест, чтобы убедиться, прежде чем проголосовать за и удалить мой ответ. Pattern был доволен вышеизложенным. - person T.J. Crowder; 18.03.2011
comment
@Daniel: Что хорошего в списке Unicode 3.0 десятилетней давности, когда Unicode до 6.0 по состоянию на прошлый год? :( - person tchrist; 18.03.2011

Вы не должны использовать блоки Unicode, когда имеете в виду скрипты Unicode. Например, ฿, который представляет собой кодовую точку U + 0E3F THAI CURRENCY SYMBOL BAHT в Unicode, является символом \p{Block=Thai} ᴀᴋᴀ \p{InThai}, но не символом \p{Script=Thai} ᴀᴋᴀ \p{IsThai}. Это символ валюты из набора \p{Script=Common}.

Особенно это актуально для больших наборов вроде греческого. В греческом блоке есть 18 кодовых точек, которых нет в греческом сценарии, и 250 кодовых точек в греческом сценарии, которых нет в греческом блоке.

К счастью, вам не нужно беспокоиться о тех, кто использует тайский язык, поскольку начиная с Unicode 6.0 только U + 0E3F является здесь исключением. Вам в этом повезло вдвойне, потому что стандартная Java не поддерживает сценарии Unicode до Java 7; странно, но факт. Для поддержки сценариев Unicode в версиях, предшествующих JDK7, вы должны использовать JNI для доступа к библиотеке регулярных выражений ICU, как это делает Google для Java на Android. Однако их подход имеет много преимуществ, поэтому, даже если это JNI, его стоит рассмотреть.

person tchrist    schedule 18.03.2011
comment
Я знаю, что вопрос касался Java, но для Perl версии позже 5.6 \p{Script=Thai} можно записать как \p{Thai} (\p{IsThai} также работает для обратной совместимости). - person Adam Millerchip; 04.09.2016