En bref: strip()
est l'évolution "compatible Unicode" de trim()
.
CSR: JDK-8200378
Problème
String :: trim existe depuis les premiers jours de Java, lorsque Unicode n'avait pas complètement évolué vers la norme que nous utilisons largement aujourd'hui.
La définition de l'espace utilisée par String :: trim est tout point de code inférieur ou égal au point de code d'espace (\ u0020), communément appelé caractères de contrôle ASCII ou ISO.
Les routines de rognage compatibles Unicode doivent utiliser Character :: isWhitespace (int).
De plus, les développeurs n'ont pas été en mesure de supprimer spécifiquement les espaces blancs d'indentation ou de supprimer spécifiquement les espaces blancs de fin.
Solution
Introduisez des méthodes de rognage qui prennent en charge les espaces blancs Unicode et offrent un contrôle supplémentaire du début ou de la fin uniquement.
Une caractéristique commune de ces nouvelles méthodes est qu'elles utilisent une définition différente (plus récente) du terme «espace blanc» que les anciennes méthodes telles que String.trim()
. Bogue JDK-8200373 .
Le JavaDoc actuel pour String :: trim n'indique pas clairement quelle définition de «espace» est utilisée dans le code. Avec des méthodes de rognage supplémentaires à venir qui utilisent une définition différente de l'espace, une clarification est impérative. String :: trim utilise la définition de l'espace comme tout point de code qui est inférieur ou égal au point de code du caractère d'espace (\ u0020.) Les nouvelles méthodes de rognage utiliseront la définition de l'espace (blanc) comme tout point de code qui retourne true lorsqu'il est passé au Prédicat Character :: isWhitespace.
La méthode a isWhitespace(char)
été ajoutée Character
avec JDK 1.1, mais la méthode isWhitespace(int)
n'a été introduite dans la Character
classe qu'à partir du JDK 1.5. La dernière méthode (celle acceptant un paramètre de type int
) a été ajoutée pour prendre en charge les caractères supplémentaires. Les commentaires Javadoc de la Character
classe définissent des caractères supplémentaires (généralement modélisés avec un "point de code" basé sur int) par rapport aux caractères BMP (généralement modélisés avec un seul caractère):
L'ensemble de caractères de U + 0000 à U + FFFF est parfois appelé le plan multilingue de base (BMP). Les caractères dont les points de code sont supérieurs à U + FFFF sont appelés caractères supplémentaires. La plate-forme Java utilise la représentation UTF-16 dans les tableaux de caractères et dans les classes String et StringBuffer. Dans cette représentation, les caractères supplémentaires sont représentés par une paire de valeurs char ... Une valeur char représente donc les points de code du plan multilingue de base (BMP), y compris les points de code de substitution ou les unités de code du codage UTF-16. Une valeur int représente tous les points de code Unicode, y compris les points de code supplémentaires. ... Les méthodes qui n'acceptent qu'une valeur char ne peuvent pas prendre en charge les caractères supplémentaires. ... Les méthodes qui acceptent une valeur int prennent en charge tous les caractères Unicode, y compris les caractères supplémentaires.
Ensemble de modifications OpenJDK .
Comparaison de référence entre trim()
et strip()
- Pourquoi String.strip () est-il 5 fois plus rapide que String.trim () pour une chaîne vide en Java 11
Voici un test unitaire qui illustre la réponse de @MikhailKholodkov, en utilisant Java 11.
(Notez que
\u2000
c'est ci-dessus\u0020
et non considéré comme un espace blanc partrim()
)la source
En général, les deux méthodes suppriment les espaces de début et de fin de la chaîne. Cependant, la différence vient lorsque nous travaillons avec des caractères unicode ou des fonctionnalités multilingues.
trim () supprime tous les caractères de début et de fin dont la valeur ASCII est inférieure ou égale à 32 ('U + 0020' ou espace).
Selon les normes Unicode, il existe différents caractères d'espacement dont la valeur ASCII est supérieure à 32 («U + 0020»). Ex: 8193 (U + 2001).
Pour identifier ces caractères d'espace, une nouvelle méthode isWhitespace (int) a été ajoutée à partir de Java 1.5 dans la classe Character. Cette méthode utilise unicode pour identifier les caractères d'espacement. Vous pouvez en savoir plus sur les caractères d'espacement Unicode ici .
La nouvelle bande de méthode qui est ajoutée dans java 11 utilise cette méthode Character.isWhitespace (int) pour couvrir une large gamme de caractères d'espace blanc et les supprimer.
exemple
Production
Remarque: Si vous exécutez sur une machine Windows, vous ne pourrez peut-être pas voir la sortie similaire en raison d'un jeu Unicode limité. vous pouvez essayer des compilateurs en ligne pour tester ce code.
reference: Différence entre la méthode de coupe et de bande java
la source