Por que trim () NÃO remove o caractere 160?
On Janeiro 31, 2021 by admin Tenho um cenário em que o rótulo de um PicklistEntry
contém um caractere 160 (espaço sem quebra) no fim do valor. Então, quando eu chamo pe.label.getChars()
, a saída da matriz é os seguintes caracteres: (104, 101, 108, 108, 111, 160)
.
Se eu chamar trim()
então getChars()
, espero que os 160 caracteres finais sejam removidos. No entanto, não é. Quando eu usar o caractere 32, trim()
o removerá corretamente.
Além disso, o uso de normalizeSpace()
remove o caractere 160 .
Minha pergunta principal é por que não “t trim()
remove esse caractere enquanto normalizeSpace()
o faz?
Veja o exemplo de código abaixo.
// 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 Além disso, ao chamar normalizeSpace()
o caractere 160 é realmente convertido para o caractere 32. Então, para cortar completamente o 160 e o adicional de 32, tenho que chamar 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)
Resposta
O documentação para corte diz:
Caracteres de controle ASCII iniciais e finais, como tabulações e caracteres de nova linha são também removido. O espaço em branco e os caracteres de controle que não estão no início ou no final da frase não são removidos.
Tomando isso literalmente, apenas espaço (ASCII 32), tabulação (ASCII 9), alimentação de linha (ASCII 10) e retorno de carro (ASCII 13) seriam removidos, deixando outros espaços em branco, como espaço sem quebra, espaço de largura zero e assim por diante, não afetados. Isso provavelmente ocorre porque trim é um método muito antigo, que remonta ao início do Apex, enquanto normalizeWhitespace é relativamente novo.
Como uma alternativa rápida que deve fazer o que que você deseja:
// 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}+$
. Eu ' incluirei um exemplo para você na resposta.