¿Por qué trim () NO elimina el carácter 160?
On enero 31, 2021 by admin Tengo un escenario en el que la etiqueta de un PicklistEntry
contiene un char 160 (espacio sin interrupciones) en el fin del valor. Entonces, cuando llamo a pe.label.getChars()
, la salida de la matriz son los siguientes caracteres: (104, 101, 108, 108, 111, 160)
.
Si llamo a trim()
luego getChars()
, espero que se elimine el carácter 160 final. Sin embargo, no es así. Cuando uso el carácter 32, trim()
lo eliminará correctamente.
Además, el uso de normalizeSpace()
SÍ elimina el carácter 160 .
Entonces, mi pregunta principal es ¿por qué «t trim()
no elimina este carácter mientras que normalizeSpace()
sí lo hace?
Vea el ejemplo de código a continuación.
// 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 Además, al llamar a normalizeSpace()
, el carácter 160 se convierte en el carácter 32. Así que para recortar completamente el 160 y los 32 adicionales, tengo que llamar 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)
Responder
El documentación para trim dice:
Los caracteres de control ASCII iniciales y finales, como tabulaciones y caracteres de nueva línea, son también eliminado. Los espacios en blanco y los caracteres de control que no están al principio o al final de la oración no se eliminan.
Tomando esto literalmente, solo se eliminarán el espacio (ASCII 32), la pestaña (ASCII 9), el salto de línea (ASCII 10) y el retorno de carro (ASCII 13), dejando otros espacios en blanco, como el espacio que no se rompe, el espacio de ancho cero, etc., no se ve afectado. Esto probablemente se deba a que el recorte es un método muy antiguo, que se remonta al comienzo de Apex, mientras que normalizeWhitespace es relativamente nuevo.
Como alternativa rápida que debería hacer lo que desea:
// 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}+$
. ' incluiré un ejemplo para ti en la respuesta.