Faire correspondre un caractère de script thaïlandais en Java


Au cours des deux dernières heures, j'ai beaucoup de temps sexy avec des chaînes de script thaïlandaises qui se sont glissées dans ma base de données. Ils s'assemblent mystérieusement, muent à la sortie, n'ont pas d'ordre naturel et sont un désastre.

Je veux simplement ignorer toutes les chaînes avec des caractères de script thaïlandais, mais je ne sais pas comment:

Pattern.compile("\\p{Thai}") échoue sur init. "[ก-๛]" - est-ce que ça marcherait un jour? Quelle est la bonne façon?

Author: tchrist, 2011-03-18

2 answers

Thai est un bloc Unicode, et les blocs Unicode doit être spécifié comme \p{In...}:

Pattern.compile("\\p{InThai}") 
 6
Author: axtavt, 2011-03-18 12:45:03

Vous ne devez pas utiliser de blocs Unicode lorsque vous voulez dire des scripts Unicode. Par exemple, un BAH, qui est le point de code U+0E3F SYMBOLE DE MONNAIE THAÏLANDAISE BAHT en Unicode, est un caractère \p{Block=Thai} ᴀᴋᴀ \p{InThai}, mais ce n'est pas un caractère \p{Script=Thai} {\p{IsThai}. C'est un symbole monétaire de l'ensemble \p{Script=Common}.

Cela est particulièrement vrai pour les grands ensembles comme le grec. Il y a 18 points de code dans le bloc grec qui ne sont pas dans l'écriture grecque, et il y a 250 points de code dans l'écriture grecque qui ne sont pas dans le grec bloc.

Heureusement, vous n'avez pas à vous soucier de ceux ici avec le thaï, car à partir d'Unicode 6.0, seul U+0E3F est une valeur aberrante ici. Vous êtes doublement chanceux à cet égard, car Java standard ne prend pas en charge les scripts Unicode antérieurs à Java 7; bizarre mais vrai. Pour la prise en charge des scripts Unicode dans les versions antérieures à JDK7, vous devez utiliser JNI pour accéder à la bibliothèque d'expressions régulières ICU, tout comme Google le fait pour Java sur Android. Il y a beaucoup d'avantages à leur appoach, cependant, donc même si c'est JNI cela peut valoir la peine d'être considéré.

 5
Author: tchrist, 2011-03-18 13:19:45