java - Perché il numero '123' è numerico?



unicode apache-commons-lang3 (5)

Secondo la documentazione, la stringa "123" è numerica.

Poiché credevo che questo potesse essere un errore nella documentazione, ho eseguito dei test per verificare la dichiarazione. Ho scoperto che secondo Apache Commons è numerico.

Perché questa stringa numerica? Cosa rappresentano quei personaggi?


Answers

Se vuoi sapere quali proprietà ha un particolare "personaggio" (e ce ne sono alcune), vai direttamente al sorgente: Unicode.org . Hanno strumenti di ricerca che possono mostrarti tutto ciò che vorresti sapere.

CONSERVAZIONE: il Consorzio Unicode produce una specifica, non un software. Ciò significa che spetta a ciascun fornitore di software implementare le specifiche nel modo più preciso possibile . Quindi, proprio come HTML, JavaScript, CSS, SQL, ecc., Esiste una variazione tra piattaforme diverse, lingue e così via. Ad esempio, ho trovato un bug in .NET Framework di Microsoft con cui cerchiato lettere latine AZ e az - Code Points da 0x24B6 a 0x24E9 - non registrato correttamente come char.IsLetter = true ( segnalazione di bug qui ). E questo porta a comportamenti imprevisti nelle funzionalità correlate, come quando si chiama il metodo TextInfo.ToTitleCase() ( segnalazione di bug qui ).


Puoi utilizzare 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 "1" è un numero di cifre .

Ora esaminiamo il valore unicode del carattere "1":

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

Questo numero è compreso nell'intervallo di cifre Devanagari , ovvero: \u0966 attraverso \u096F .

Prova anche:

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

Devanagari è:

è un alfabeto abugida (alphasyllabary) dell'India e del Nepal

"123" è un "123" (Unicode latino di base).

Lettura:


Perché "CharSequence contiene solo cifre Unicode" (citando la tua documentazione collegata ).

Tutti i caratteri restituiscono true per Character.isDigit :

Alcuni intervalli di caratteri Unicode che contengono cifre:

  • '\ u0030' attraverso '\ u0039', cifre ISO-LATIN-1 (da '0' a '9')
  • '\ u0660' fino a '\ u0669', cifre in arabo
  • '\ u06F0' attraverso '\ u06F9', cifre dell'indice arabo esteso
  • '\ u0966' fino a '\ u096F', cifre di Devanagari
  • '\ uFF10' fino a '\ uFF19', cifre Fullwidth

Anche molti altri intervalli di caratteri contengono cifre.

१२३ sono cifre di Devanagari:


I simboli "123" sono in realtà derivati ​​dalla lingua hindi (fondamentalmente dal linguaggio sanscrito, ovvero Devanagiri) che rappresentano valori numerici come:

1 rappresenta 1

2 rappresentano 2

e come saggio


La stringa è immutabile e va al pool di stringhe. Una volta scritto, non può essere sovrascritto.

char[] è un array che dovresti sovrascrivere una volta che hai usato la password e questo è come dovrebbe essere fatto:

char[] passw = request.getPassword().toCharArray()
if (comparePasswords(dbPassword, passw) {
 allowUser = true;
 cleanPassword(passw);
 cleanPassword(dbPassword);
 passw=null;
}

private static void cleanPassword (char[] pass) {
 for (char ch: pass) {
  ch = null;
 }
}

Uno scenario in cui l'hacker potrebbe utilizzarlo è un crashdump: quando la JVM si arresta in modo anomalo e genera un dump della memoria, sarà possibile vedere la password.

Questo non è necessariamente un aggressore esterno malintenzionato. Questo potrebbe essere un utente di supporto che ha accesso al server per scopi di monitoraggio. Poteva sbirciare in un crashdump e trovare le password.





java unicode apache-commons-lang3