java - Perché Apache Commons considera '१२३' numerico?




unicode number-systems (4)

I simboli '१२३' sono in realtà derivati ​​dalla lingua hindi (fondamentalmente dalla lingua sanscrita cioè Devanagiri) che rappresentano valori numerici proprio come:

१ rappresentano 1

२ rappresentano 2

e come saggio

Secondo la documentazione di Apache Commons Lang per StringUtils.isNumeric() , la stringa '१२३' è numerica.

Dato che credevo che questo potesse essere un errore nella documentazione, ho eseguito dei test per verificare l'affermazione. Ho scoperto che secondo Apache Commons è numerico.

Perché questa stringa è numerica? Cosa rappresentano quei personaggi?


Il simbolo १२३ è uguale a 123 per la lingua nepalese o qualsiasi altra lingua che usa la scrittura Devanagari come hindi, gujarati e così via, ed è quindi un numero per Apache Commons.


Puoi usare Character#getType per controllare la categoria generale del personaggio:

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

Questo verrà stampato true , che è una "prova" che "१" è un numero di cifre .

Ora esaminiamo il valore unicode del carattere '१':

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

Questo numero è compreso nell'intervallo delle cifre Devanagari , ovvero da \u0966 a \u096F .

Prova anche:

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

Devanagari è:

è un alfabeto abugida (alphasyllabary) di India e Nepal

"१२३" è un "123" (Unicode latino di base).

Lettura:


Se vuoi mai sapere quali proprietà ha un particolare "personaggio" (e ce ne sono parecchie), vai direttamente alla fonte: Unicode.org . Hanno strumenti di ricerca che possono mostrarti quasi tutto ciò che ti piacerebbe sapere.

TENERE PRESENTE: il consorzio Unicode produce una specifica, non un software. Ciò significa che spetta a ciascun fornitore di software implementare le specifiche nel modo più accurato possibile . Quindi, proprio come HTML, JavaScript, CSS, SQL, ecc., Esiste una variazione tra piattaforme, lingue diverse e così via. Ad esempio, ho trovato un bug nel .NET Framework di Microsoft in base al quale cerchiavano lettere latine AZ e az - punti di codice da 0x24B6 a 0x24E9 - non si registrano correttamente come char.IsLetter = true ( rapporto sui bug qui ). E questo porta a comportamenti imprevisti nelle funzionalità correlate, come quando si chiama il metodo TextInfo.ToTitleCase() ( report dei bug qui ).







apache-commons-lang3