Varför tar trim () INTE bort char 160?
On januari 31, 2021 by admin Jag har ett scenario där etiketten för en PicklistEntry
innehåller ett tecken 160 (icke-brytande utrymme) vid slutet av värdet. Så när jag ringer till pe.label.getChars()
är matrisutmatningen följande tecken: (104, 101, 108, 108, 111, 160)
.
Om jag ringer till trim()
sedan getChars()
, jag förväntar mig att det efterföljande 160-tecknet ska tas bort. Det är dock inte. När jag använder char 32 tar trim()
bort den korrekt.
Dessutom tar du bort char 160 genom att använda normalizeSpace()
.
Så min huvudfråga är varför tar inte ”t trim()
bort det här tecknet medan normalizeSpace()
gör det?
Se kodexempel nedan.
// 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 Dessutom, när du ringer till normalizeSpace()
konverteras char 160 faktiskt till char 32. Så för att helt trimma 160 och ytterligare 32 måste jag ringa 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 för trim säger:
Ledande och efterföljande ASCII-styrtecken som flikar och nylinjetecken är har också tagits bort. Mellanslag och kontrolltecken som inte finns i början eller slutet av meningen tas inte bort.
Om vi tar detta bokstavligen skulle endast mellanslag (ASCII 32), flik (ASCII 9), radmatning (ASCII 10) och vagnretur (ASCII 13) tas bort, lämnar andra vita utrymmen, såsom icke-brytande utrymme, utrymme med nollbredd och så vidare opåverkade. Detta beror troligen på att trim är en väldigt gammal metod som går tillbaka till början av Apex, medan normalizeWhitepace är relativt nytt.
Som ett snabbt alternativ som borde göra vad du vill:
// 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}+$
. Jag ' Jag tar ett exempel åt dig i svaret.