Warum entfernt trim () char 160 NICHT?
On Januar 31, 2021 by admin Ich habe ein Szenario, in dem die Bezeichnung eines PicklistEntry
ein Zeichen 160 (nicht unterbrechendes Leerzeichen) am enthält Ende des Wertes. Wenn ich also pe.label.getChars()
aufrufe, besteht die Array-Ausgabe aus den folgenden Zeichen: (104, 101, 108, 108, 111, 160)
.
Wenn ich trim()
dann getChars()
, ich erwarte, dass das nachfolgende 160-Zeichen entfernt wird. Dies ist jedoch nicht der Fall. Wenn ich char 32 verwende, wird es von trim()
korrekt entfernt.
Wenn Sie normalizeSpace()
verwenden, wird das char 160 entfernt .
Meine Hauptfrage ist also, warum „t trim()
dieses Zeichen nicht entfernt, während normalizeSpace()
dies tut?
Siehe Codebeispiel unten.
// 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"
BEARBEITEN Wenn ich normalizeSpace()
aufrufe, wird das Zeichen 160 tatsächlich in Zeichen 32 konvertiert. Um das 160 und die zusätzlichen 32 vollständig zu trimmen, muss ich
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)
Antwort
Die Dokumentation für das Trimmen lautet:
Führende und nachfolgende ASCII-Steuerzeichen wie Tabulatoren und Zeilenumbrüche sind Auch Leerzeichen und Steuerzeichen, die nicht am Anfang oder Ende des Satzes stehen, werden nicht entfernt.
Wenn man dies wörtlich nimmt, werden nur Leerzeichen (ASCII 32), Tabulator (ASCII 9), Zeilenvorschub (ASCII 10) und Wagenrücklauf (ASCII 13) entfernt. Lassen Sie andere Leerzeichen, wie z. B. nicht unterbrechendes Leerzeichen, Leerzeichen mit der Breite Null usw., unberührt. Dies liegt wahrscheinlich daran, dass Trim eine sehr alte Methode ist, die auf den Anfang von Apex zurückgeht, während normalizeWhitespace relativ neu ist.
Als schnelle Alternative, die was tun sollte Sie möchten:
// 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"
Kommentare
- Sinnvoll, danke. Lohnt es sich, ein Ticket mit Unterstützung zu öffnen, um vorzuschlagen, dass diese zusätzlichen Zeichen in Ordnung gebracht werden? Ich könnte ein Szenario sehen, in dem Sie ' nicht normalizeSpace verwenden möchten, da dadurch Dupes in der gesamten Zeichenfolge entfernt werden.
- @fehays Sie könnten es versuchen, aber mein Bestes Vermutlich würden sie keinen Fehler protokollieren, oder wenn sie dies tun würden, würde er geschlossen / NoFix werden. Wenn Sie eine robustere Lösung benötigen, ziehen Sie String.replaceAll in Betracht, das einen regulären Ausdruck zum Ersetzen akzeptiert. Zum Beispiel:
^\\p{IsWhite_Space}+|\\p{IsWhite_Space}+$
. Ich ' werde ein Beispiel für Sie in die Antwort aufnehmen.
Schreibe einen Kommentar