Подберите символ тайского сценария в Java - PullRequest
3 голосов
/ 18 марта 2011

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

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

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

Ответы [ 2 ]

8 голосов
/ 18 марта 2011

Thai является блоком Unicode, и блоки Unicode должны быть указаны как \p{In...}:

Pattern.compile("\\p{InThai}") 
5 голосов
/ 18 марта 2011

Вы не должны использовать блоки Unicode, когда вы имеете в виду сценарии Unicode.Например, символ ฿, представляющий собой кодовую точку U + 0E3F ТАЙСКОГО ВАЛЮТНОГО СИМВОЛА BAHT в Юникоде, представляет собой символ \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, стоит подумать.

...