Pourquoi trim () ne supprime PAS le char 160?
On janvier 31, 2021 by admin Jai un scénario où le libellé dun PicklistEntry
contient un caractère 160 (espace insécable) à la fin de la valeur. Ainsi, lorsque jappelle pe.label.getChars()
la sortie du tableau est les caractères suivants: (104, 101, 108, 108, 111, 160)
.
Si jappelle trim()
puis getChars()
, je mattends à ce que le caractère 160 de fin soit supprimé. Cependant, ce nest pas le cas. Lorsque jutilise le caractère 32, trim()
le supprimera correctement.
De plus, lutilisation de normalizeSpace()
supprime le caractère 160 .
Ma principale question est donc de savoir pourquoi « t trim()
ne supprime-t-il pas ce caractère alors que normalizeSpace()
le fait?
Voir lexemple de code ci-dessous.
// get "hello " from character array using 160 for space String hello = String.fromCharArray(new Integer[] { 104, 101, 108, 108, 111, 160 }); System.debug("==>" + hello.trim()); //output ==> "hello " // get "hello " from character array using 32 for space hello = String.fromCharArray(new Integer[] { 104, 101, 108, 108, 111, 32 }); System.debug("==>" + hello.trim()); //output ==> "hello" // get "hello " from character array using 160 for space and call normalizeSpace() hello = String.fromCharArray(new Integer[] { 104, 101, 108, 108, 111, 160 }); System.debug("==>" + hello.normalizeSpace()); //output ==> "hello"
EDIT De plus, lors de lappel de normalizeSpace()
, le char 160 est en fait converti en char 32. Donc, pour couper complètement les 160 et les 32 supplémentaires, je dois appeler normalizeSpace().trim()
String hello = String.fromCharArray(new Integer[] { 104, 101, 108, 108, 111, 160 }); String normalized = hello.normalizeSpace(); System.debug("==>" + normalized); //output ==> "hello" System.debug("==>" + normalized.getChars()); //output ==> (104, 101, 108, 108, 111, 32)
Réponse
Le la documentation pour le trim dit:
Les caractères de contrôle ASCII de début et de fin tels que les tabulations et les caractères de nouvelle ligne sont également supprimés. Les espaces blancs et les caractères de contrôle qui ne sont ni au début ni à la fin de la phrase ne sont pas supprimés.
À la lettre, seuls lespace (ASCII 32), la tabulation (ASCII 9), le saut de ligne (ASCII 10) et le retour chariot (ASCII 13) seraient supprimés, laissant les autres espaces, tels que les espaces insécables, les espaces de largeur nulle, etc. non affectés. Ceci est probablement dû au fait que trim est une méthode très ancienne, datant du début d’Apex, alors que normalizeWhitespace est relativement nouveau.
Comme alternative rapide qui devrait faire quoi vous voulez:
// get " hello " from character array using 160 for space String hello = String.fromCharArray(new Integer[] { 160, 104, 101, 108, 108, 111, 160 }); System.debug("==>"" + hello.replaceAll("^\\p{IsWhite_Space}+|\\p{IsWhite_Space}+$","")+"""); //output ==>"hello"
^\\p{IsWhite_Space}+|\\p{IsWhite_Space}+$
. Je ' Je vais inclure un exemple pour vous dans la réponse.