Dlaczego trim () NIE usuwa char 160?
On 31 stycznia, 2021 by admin Mam scenariusz, w którym etykieta PicklistEntry
zawiera znak 160 (nierozdzielającą spację) w koniec wartości. Więc kiedy dzwonię do pe.label.getChars()
, tablica wyjściowa składa się z następujących znaków: (104, 101, 108, 108, 111, 160)
.
Jeśli wywołam trim()
, a następnie getChars()
, oczekuję, że końcowe 160 znaków zostanie usunięte. Jednak tak się nie dzieje. Kiedy używam znaku 32, trim()
usunie go poprawnie.
Dodatkowo, używając normalizeSpace()
CZY usuwa znak 160 .
Więc moje główne pytanie brzmi: dlaczego „t trim()
nie usuwa tego znaku, podczas gdy normalizeSpace()
robi?
Zobacz przykład kodu poniżej.
// 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"
EDYTUJ Dodatkowo, podczas wywoływania normalizeSpace()
znak 160 jest faktycznie konwertowany na znak 32. Aby więc całkowicie przyciąć 160 i dodatkowe 32, muszę wywołać 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)
Odpowiedź
dokumentacja dla trim mówi:
Początkowe i końcowe znaki sterujące ASCII, takie jak tabulatory i znaki nowej linii są również usunięte. Białe spacje i znaki kontrolne, które nie znajdują się na początku ani na końcu zdania, nie są usuwane.
Biorąc to dosłownie, tylko spacja (ASCII 32), tabulator (ASCII 9), znak nowego wiersza (ASCII 10) i powrót karetki (ASCII 13) zostałyby usunięte, pozostawiając inne białe spacje, takie jak nierozdzielająca spacja, spacja o zerowej szerokości i tak dalej nienaruszone. Dzieje się tak prawdopodobnie dlatego, że przycinanie jest bardzo starą metodą, sięgającą początków Apex, podczas gdy normalizeWhitespace jest stosunkowo nowa.
Jako szybka alternatywa, która powinna zrobić to, co chcesz:
// 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}+$
. ' W odpowiedzi dołączę przykład dla Ciebie.