Em resumo: strip()
é a evolução “Unicode-aware” de trim()
.
CSR : JDK-8200378
Problem
String::trim tem existido desde os primórdios do Java quando Unicode não tinha evoluído completamente para o padrão que usamos hoje em dia.
A definição de espaço usada por String::trim é qualquer ponto de código menor ou igual ao ponto de código de espaço (\u0020), comumente chamado de caracteres ASCII ou de controle ISO.
As rotinas de corte com consciência de Unicode devem usar Character::isWhitespace(int).
Adicionalmente, os desenvolvedores não foram capazes de remover especificamente o espaço branco de indentação ou de remover especificamente o espaço branco de indentação.
Solução
Introduzir métodos de corte que sejam Unicode conscientes do espaço em branco e forneçam controle adicional de apenas conduzir ou apenas conduzir.
Uma característica comum desses novos métodos é que eles usam uma definição diferente (mais nova) de “espaço em branco” do que os métodos antigos como String.trim()
. Bug JDK-8200373.
O JavaDoc atual para String::trim não deixa claro qual definição de “espaço” está sendo usada no código. Com métodos de corte adicionais que usam uma definição diferente de espaço num futuro próximo, é imperativo esclarecer. String::trim usa a definição de espaço como qualquer codepoint que seja menor ou igual ao codepoint do caractere espaço (\u0020.) Novos métodos de corte de linha usarão a definição de espaço (branco) como qualquer codepoint que retorna verdadeiro quando passado para o predicado Character::isWhitespace.
O método isWhitespace(char)
foi adicionado a Character
com JDK 1.1, mas o método isWhitespace(int)
não foi introduzido na classe Character
até JDK 1.5. O último método (o que aceita um parâmetro do tipo int
) foi adicionado para suportar caracteres suplementares. Os comentários Javadoc para a classe Character
definem caracteres suplementares (tipicamente modelados com “code point” baseado em int-based) versus caracteres BMP (tipicamente modelados com um único caracter):
O conjunto de caracteres de U+0000 a U+FFFF é por vezes referido como o Plano Básico Multilingue (BMP). Os caracteres cujos pontos de código são maiores que U+FFFF são chamados de caracteres suplementares. A plataforma Java usa a representação UTF-16 em matrizes de caracteres e nas classes String e StringBuffer. Nesta representação, os caracteres suplementares são representados como um par de valores de caracteres … Um valor char, portanto, representa os pontos de código do Plano Básico Multilíngue (BMP), incluindo os pontos de código substituto, ou unidades de código da codificação UTF-16. Um valor int representa todos os pontos de código Unicode, incluindo os pontos de código suplementares. … Os métodos que só aceitam um valor char não podem suportar caracteres suplementares. … Os métodos que aceitam um valor int suportam todos os caracteres Unicode, incluindo caracteres suplementares.
OpenJDK Changeset.
Benchmark comparison between trim()
and strip()
– Why is String.strip() 5 times faster than String.trim() for blank string In Java 11