In breve: strip()
è l’evoluzione “Unicode-aware” di trim()
.
CSR : JDK-8200378
Problema
String::trim esiste dai primi giorni di Java quando Unicode non era completamente evoluto allo standard che usiamo oggi.
La definizione di spazio usata da String::trim è qualsiasi punto di codice minore o uguale al punto di codice spazio (\u0020), comunemente indicato come ASCII o caratteri di controllo ISO.
Le routine di trimming sensibili all’Unicode dovrebbero usare Character::isWhitespace(int).
Inoltre, gli sviluppatori non sono stati in grado di rimuovere specificamente gli spazi bianchi di indentazione o di rimuovere specificamente gli spazi bianchi di coda.
Soluzione
Introdurre metodi di trimming che sono consapevoli dello spazio bianco Unicode e forniscono un controllo aggiuntivo di solo leading o solo trailing.
Una caratteristica comune di questi nuovi metodi è che usano una diversa (più nuova) definizione di “spazio bianco” rispetto ai vecchi metodi come String.trim()
. Bug JDK-8200373.
L’attuale JavaDoc per String::trim non chiarisce quale definizione di “spazio” viene usata nel codice. Con ulteriori metodi di trimming in arrivo nel prossimo futuro che usano una diversa definizione di spazio, il chiarimento è imperativo. String::trim usa la definizione di spazio come qualsiasi punto di codice che sia minore o uguale al punto di codice del carattere spazio (\u0020.) I nuovi metodi di taglio useranno la definizione di spazio (bianco) come qualsiasi punto di codice che restituisce true quando viene passato al predicato Character::isWhitespace.
Il metodo isWhitespace(char)
è stato aggiunto a Character
con JDK 1.1, ma il metodo isWhitespace(int)
non è stato introdotto nella classe Character
fino a JDK 1.5. Quest’ultimo metodo (quello che accetta un parametro di tipo int
) è stato aggiunto per supportare i caratteri supplementari. I commenti Javadoc per la classe Character
definiscono i caratteri supplementari (tipicamente modellati con “code point” basati su int) rispetto ai caratteri BMP (tipicamente modellati con carattere singolo):
L’insieme di caratteri da U+0000 a U+FFFF è talvolta indicato come il piano multilingue di base (BMP). I caratteri i cui punti di codice sono maggiori di U+FFFF sono chiamati caratteri supplementari. La piattaforma Java usa la rappresentazione UTF-16 negli array di caratteri e nelle classi String e StringBuffer. In questa rappresentazione, i caratteri supplementari sono rappresentati come una coppia di valori char … Un valore char, quindi, rappresenta i punti di codice Basic Multilingual Plane (BMP), compresi i punti di codice surrogati, o unità di codice della codifica UTF-16. Un valore int rappresenta tutti i punti di codice Unicode, compresi i punti di codice supplementari. … I metodi che accettano solo un valore char non possono supportare i caratteri supplementari. … I metodi che accettano un valore int supportano tutti i caratteri Unicode, compresi i caratteri supplementari.
OpenJDK Changeset.
Confronto benchmark tra trim()
e strip()
– Perché String.strip() è 5 volte più veloce di String.trim() per stringa vuota In Java 11