Proč trim () NEODSTRAŇUJE znak 160?
On 31 ledna, 2021 by admin Mám scénář, kde štítek PicklistEntry
obsahuje znak 160 (nerozbitný prostor) na konec hodnoty. Takže když volám pe.label.getChars()
výstup pole je následující znaky: (104, 101, 108, 108, 111, 160)
.
Pokud volám trim()
potom getChars()
očekávám, že bude odstraněn koncový 160 znak. Není tomu tak. Když používám char 32, trim()
jej správně odstraní.
Navíc pomocí normalizeSpace()
ODEBRÁM char 160 .
Moje hlavní otázka tedy je, proč tento znak „t trim()
neodstraní, zatímco normalizeSpace()
ano?
Viz příklad kódu níže.
// 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 Navíc při volání normalizeSpace()
je znak 160 ve skutečnosti převeden na znak 32. Abych 160 a dalších 32 kompletně ořezal, musím zavolat 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)
odpověď
dokumentace pro trim říká:
Přední a koncové řídicí znaky ASCII, jako jsou karty a znaky nového řádku, jsou také odstraněno. Mezery a řídicí znaky, které nejsou na začátku nebo na konci věty, nebudou odstraněny.
Když to vezmeme doslovně, bude odstraněn pouze prostor (ASCII 32), karta (ASCII 9), řádkování (ASCII 10) a návrat vozíku (ASCII 13), ostatní mezery, například nerozbitný prostor, prostor s nulovou šířkou atd. zůstanou nedotčeny. Je to pravděpodobně proto, že trim je velmi stará metoda, která se datuje od počátku Apexu, zatímco normalizeWhitespace je relativně nová.
Jako rychlá alternativa, která by měla dělat to, co chcete:
// 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}+$
. ' V odpovědi uvedu příklad.