Hvorfor fjerner trim () IKKE char 160?
On januar 31, 2021 by admin Jeg har et scenarie, hvor etiketten til en PicklistEntry
indeholder en char 160 (ikke-brudende plads) ved slutningen af værdien. Så når jeg kalder pe.label.getChars()
, er array-output følgende tegn: (104, 101, 108, 108, 111, 160)
.
Hvis jeg kalder trim()
derefter getChars()
, jeg forventer, at det efterfølgende 160 tegn fjernes. Det er dog ikke. Når jeg bruger char 32, fjerner trim()
det korrekt.
Derudover fjerner char 160 med brug af normalizeSpace()
.
Så mit hovedspørgsmål er, hvorfor fjerner ikke “t trim()
dette tegn, mens normalizeSpace()
gø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"
REDIGER Når du ringer til normalizeSpace()
konverteres også char 160 faktisk til char 32. Så for fuldstændigt at trimme 160 og yderligere 32 er jeg nødt til at ringe til 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
dokumentation til trim siger:
Førende og efterfølgende ASCII-kontroltegn som faner og nye linjetegn er også fjernet. Hvide mellemrum og kontroltegn, der ikke er i begyndelsen eller slutningen af sætningen, fjernes ikke.
Ved at tage dette bogstaveligt, fjernes kun mellemrum (ASCII 32), fane (ASCII 9), linjefodring (ASCII 10) og vognretur (ASCII 13), forlader andet hvidt mellemrum, såsom ikke-brudende rum, nulbreddeplads osv. upåvirket. Dette skyldes sandsynligvis, at trim er en meget gammel metode, der går tilbage til begyndelsen af Apex, mens normalizeWhitepace er relativt nyt.
Som et hurtigt alternativ, der skal gøre hvad du vil have:
// 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 til dig i svaret.