De ce trim () NU elimină caracterul 160?
On ianuarie 31, 2021 by admin Am un scenariu în care eticheta unui PicklistEntry
conține un caracter 160 (spațiu care nu se rupe) la sfârșitul valorii. Deci, când apelez la pe.label.getChars()
, ieșirea matricei are următoarele caractere: (104, 101, 108, 108, 111, 160)
.
Dacă sun la trim()
apoi getChars()
, mă aștept să fie eliminat 160 de caractere finale. Cu toate acestea, nu este. Când folosesc caracterul 32, trim()
îl va elimina corect.
În plus, folosind normalizeSpace()
ÎNLĂTURĂ caracterul 160 .
Deci întrebarea mea principală este de ce nu „t trim()
elimină acest caracter în timp ce normalizeSpace()
elimină?
Vedeți exemplul de cod de mai jos.
// 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 În plus, când apelez normalizeSpace()
, char 160 este de fapt convertit în char 32. Deci, pentru a tăia complet 160 și 32 suplimentare, trebuie să apelez 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ăspuns
documentația pentru trim spune:
Caracterele de control ASCII de conducere și de final, precum filele și caracterele newline sunt de asemenea, eliminate. Spațiul alb și caracterele de control care nu sunt la începutul sau la sfârșitul propoziției nu sunt eliminate.
Luând acest lucru la propriu, doar spațiul (ASCII 32), fila (ASCII 9), avansul de linie (ASCII 10) și returul carului (ASCII 13) vor fi eliminate, lăsând alte spații albe, cum ar fi spațiu care nu se rupe, spațiu cu lățime zero și așa mai departe neafectate. Acest lucru se datorează probabil faptului că trim este o metodă foarte veche, datând de la începutul Apex, în timp ce normalizeWhitespace este relativ nou.
Ca alternativă rapidă care ar trebui să facă ceea ce doriți:
// 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}+$
. ' voi include un exemplu pentru dvs. în răspuns.