web-dev-qa-db-fra.com

Quelle est la différence entre Character.isAlphabetic et Character.isLetter en Java?

Quelle est la différence entre Character.isAlphabetic () et Character.isLetter () en Java? Quand doit-on en utiliser un et quand doit-on utiliser l'autre?

40
Simon Kissane

Selon API docs , isLetter () renvoie true si le personnage possède l'un des types de catégorie générale suivants: UPPERCASE_LETTER (Lu), LOWERCASE_LETTER (Ll), TITLECASE_LETTER (Lt), MODIFIER_LETTER (Lm), OTHER_LETTER (Lo). Si nous comparons isAlphabetic (), il a la même chose mais ajoute LETTER_NUMBER (Nl), ainsi que tous les caractères ayant la propriété Other_Alphabetic.

Qu'est-ce que cela signifie dans la pratique? Chaque lettre est alphabétique, mais chaque alphabétique n'est pas une lettre - dans Java 7 (qui utilise Unicode 6.0.0), il y a 824 caractères dans le BMP qui sont alphabétiques mais pas des lettres. Quelques exemples incluent 0345 (un combineur utilisé en grec polytonique), des points de voyelle hébraïque (niqqud) à partir de 05B0, des honorifiques arabes tels que saw ("que la paix soit sur lui") à 0610, des points de voyelle arabe. .. la liste continue.

Mais fondamentalement, pour le texte anglais, la distinction ne fait aucune différence. Pour certaines autres langues, la distinction peut faire la différence, mais il est difficile de prévoir à l'avance quelle pourrait être la différence dans la pratique. Si l'on a le choix, la meilleure réponse peut être isLetter () - on peut toujours changer pour autoriser des caractères supplémentaires à l'avenir, mais réduire le jeu de caractères acceptés pourrait être plus difficile.

38
Simon Kissane