Hvorfor fjerner trim () IKKE røye 160?
On januar 31, 2021 by admin Jeg har et scenario der etiketten til en PicklistEntry
inneholder en rute 160 (ikke-brudd mellomrom) på slutten av verdien. Så når jeg ringer til pe.label.getChars()
, er arrayutgangen følgende tegn: (104, 101, 108, 108, 111, 160)
.
Hvis jeg ringer til trim()
så getChars()
, jeg forventer at det etterfølgende 160 tegnet skal fjernes. Det er imidlertid ikke det. Når jeg bruker røye 32, fjerner trim()
den riktig.
I tillegg fjerner røye 160 med normalizeSpace()
.
Så mitt hovedspørsmål er hvorfor ikke «t trim()
fjerner dette tegnet mens normalizeSpace()
gjør det?
Se kodeeksempel nedenfor.
// 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 I tillegg, når du ringer til normalizeSpace()
blir char 160 faktisk konvertert til char 32. Så for å fullstendig trimme 160 og ytterligere 32, må jeg ringe 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)
Svar
dokumentasjon for trim sier:
Ledende og etterfølgende ASCII-kontrolltegn som faner og nye linjetegn er også fjernet. Mellomrom og kontrolltegn som ikke er i begynnelsen eller slutten av setningen fjernes ikke.
Hvis vi tar dette bokstavelig, vil bare mellomrom (ASCII 32), fane (ASCII 9), linjefôring (ASCII 10) og vognretur (ASCII 13) bli fjernet, forlater annet hvitt mellomrom, for eksempel ikke-brytende rom, nullbreddeplass, og så videre upåvirket. Dette er sannsynligvis fordi trim er en veldig gammel metode, som går helt tilbake til begynnelsen av Apex, mens normalizeWhitepace er relativt nytt.
Som et raskt alternativ som skal gjøre det du vil:
// 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}+$
. Jeg ' Jeg inkluderer et eksempel for deg i svaret.