Waarom verwijdert trim () NIET char 160?
Geplaatst op januari 31, 2021 door admin Ik heb een scenario waarin het label van een PicklistEntry
een teken 160 (niet-afbrekende spatie) bevat aan de einde van de waarde. Dus als ik pe.label.getChars()
aanroep, bestaat de array-uitvoer uit de volgende tekens: (104, 101, 108, 108, 111, 160)
.
Als ik trim()
en vervolgens getChars()
, verwacht ik dat het achterliggende teken van 160 zal worden verwijderd. Maar dat is niet zo. Wanneer ik char 32 gebruik, trim()
zal het correct verwijderen.
Bovendien verwijdert het gebruik van normalizeSpace()
het char 160 .
Dus mijn belangrijkste vraag is waarom “t trim()
dit karakter niet verwijdert terwijl normalizeSpace()
dit wel doet?
Zie het codevoorbeeld hieronder.
// 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 Bovendien, wanneer ik normalizeSpace()
aanroept, wordt het teken 160 feitelijk geconverteerd naar teken 32. Dus om de 160 en extra 32 volledig te trimmen, moet ik
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)
Antwoord
Het documentatie voor trim zegt:
ASCII-besturingstekens voor en achter, zoals tabs en newline-tekens zijn ook verwijderd Witruimte en besturingstekens die niet aan het begin of einde van de zin staan, worden niet verwijderd.
Als we dit letterlijk nemen, worden alleen de spatie (ASCII 32), tab (ASCII 9), line feed (ASCII 10) en regelterugloop (ASCII 13) verwijderd, waarbij andere witruimte, zoals niet-afbrekende spatie, nul-breedte ruimte, enzovoort onaangetast blijft. Dit komt waarschijnlijk doordat trim een zeer oude methode is, die teruggaat tot het begin van Apex, terwijl normalizeWhitespace relatief nieuw is.
Als een snel alternatief dat zou moeten doen wat je wilt:
// 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}+$
. Ik ' neem een voorbeeld voor jou op in het antwoord.