web-dev-qa-db-fra.com

Pourquoi Apache Commons considère-t-il le caractère '१२३' numérique?

Selon la documentation d'Apache Commons Lang pour StringUtils.isNumeric() , la chaîne '१२३' est numérique.

Puisque je pensais que cela pourrait être une erreur dans la documentation, j'ai effectué des tests pour vérifier cette déclaration. J'ai trouvé que, selon Apache Commons, il est numérique.

Pourquoi cette chaîne est-elle numérique? Que représentent ces personnages?

100
Hannes

Parce que "CharSequence ne contient que des chiffres Unicode" (citant votre documentation liée ).

Tous les caractères retournent vrais pour Character.isDigit :

Certaines plages de caractères Unicode contenant des chiffres:

  • "\ u0030" à "\ u0039", chiffres ISO-LATIN-1 ("0" à "9")
  • '\ u0660' à '\ u0669', chiffres arabe-indien
  • '\ u06F0' à '\ u06F9', chiffres étendus arabe-indien
  • '\ u0966' à '\ u096F', chiffres en devanagari
  • '\ uFF10' à '\ uFF19', chiffres pleine largeur

De nombreuses autres plages de caractères contiennent également des chiffres.

१२३ sont des chiffres Devanagari:

196
Andy Turner

Le symbole est identique à 123 pour le népalais ou toute autre langue utilisant le script Devanagari , tel que l'hindi, le gujarati. , etc., et constitue donc un numéro pour Apache Commons.

Vous pouvez utiliser Character#getType pour vérifier la catégorie générale du personnage:

System.out.println(Character.DECIMAL_DIGIT_NUMBER == Character.getType('१'));

Ceci imprimera true, ce qui est une "preuve" que "१" est un chiffre nombre.

Examinons maintenant la valeur unicode du caractère '':

System.out.println(Integer.toHexString('१'));
// 967

Ce nombre est dans la gamme de chiffres Devanagari - qui est: \u0966 par \u096F.

Essayez aussi:

Character.UnicodeBlock block = Character.UnicodeBlock.of('१');
System.out.println(block.toString());
// DEVANAGARI

Devanagari est:

est un alphabet abugida (alphasyllabary) de l'Inde et du Népal

"" Est un "123" (unicode de base en latin).

En train de lire:

27
Maroun

Si vous voulez savoir quelles propriétés a un "personnage" particulier (et il y en a beaucoup), allez directement à la source: Unicode.org . Ils ont des outils de recherche qui peuvent vous montrer presque tout ce que vous voudriez savoir.

GARDER À L'ESPRIT: Le consortium Unicode produit une spécification, pas un logiciel. Cela signifie que chaque éditeur de logiciel doit mettre en œuvre la spécification == [- aussi précisément que possible. Donc, tout comme HTML, JavaScript, CSS, SQL, etc., il existe des variations entre les différentes plates-formes, langues, etc. Par exemple, j'ai trouvé un bogue dans le .NET Framework de Microsoft qui encerclait les lettres latines A-Z Et a-z - Les points de code 0x24B6 à 0x24E9 - ne s'enregistrent pas correctement en tant que char.IsLetter = true ( rapport de bug ici ). Et cela entraîne un comportement inattendu dans les fonctionnalités associées, comme lors de l'appel de la méthode TextInfo.ToTitleCase() ( rapport de bogue ici ).

24
Solomon Rutzky

Les symboles '१२३' sont en fait dérivés de la langue hindi (essentiellement de la langue sanskrit c'est-à-dire Devanagiri) qui représente des valeurs numériques telles que:

१ représente 1

Représente 2

et également

20
Nayan Katkani